2021-10-31 17:24:55 +08:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
2022-03-20 17:17:06 +08:00
|
|
|
abstract class Comparable<T> {
|
|
|
|
bool compare(T? previous, T? current);
|
|
|
|
}
|
|
|
|
|
|
|
|
class ObjectComparable<T> extends Comparable<T> {
|
|
|
|
@override
|
|
|
|
bool compare(T? previous, T? current) {
|
|
|
|
return previous == current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-31 17:24:55 +08:00
|
|
|
class PublishNotifier<T> extends ChangeNotifier {
|
|
|
|
T? _value;
|
2022-03-20 17:17:06 +08:00
|
|
|
Comparable<T>? comparable = ObjectComparable();
|
|
|
|
|
|
|
|
PublishNotifier({this.comparable});
|
2021-10-31 17:24:55 +08:00
|
|
|
|
|
|
|
set value(T newValue) {
|
2022-03-20 17:17:06 +08:00
|
|
|
if (comparable != null) {
|
|
|
|
if (comparable!.compare(_value, newValue)) {
|
|
|
|
_value = newValue;
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
} else {
|
2021-11-11 19:56:30 +08:00
|
|
|
_value = newValue;
|
|
|
|
notifyListeners();
|
|
|
|
}
|
2021-10-31 17:24:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
T? get currentValue => _value;
|
|
|
|
|
2022-08-30 20:54:11 +08:00
|
|
|
void addPublishListener(void Function(T) callback,
|
|
|
|
{bool Function()? listenWhen}) {
|
2021-11-11 19:56:30 +08:00
|
|
|
super.addListener(
|
|
|
|
() {
|
2022-04-16 20:20:00 +08:00
|
|
|
if (_value == null) {
|
|
|
|
return;
|
2022-08-31 11:15:35 +08:00
|
|
|
} else {}
|
2022-04-16 20:20:00 +08:00
|
|
|
|
|
|
|
if (listenWhen != null && listenWhen() == false) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-31 11:15:35 +08:00
|
|
|
callback(_value as T);
|
2021-11-11 19:56:30 +08:00
|
|
|
},
|
|
|
|
);
|
2021-10-31 17:24:55 +08:00
|
|
|
}
|
|
|
|
}
|
2022-08-30 20:54:11 +08:00
|
|
|
|
|
|
|
class Notifier extends ChangeNotifier {
|
|
|
|
void notify() {
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|