notifier.dart 1005 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import 'package:flutter/material.dart';
  2. abstract class Comparable<T> {
  3. bool compare(T? previous, T? current);
  4. }
  5. class ObjectComparable<T> extends Comparable<T> {
  6. @override
  7. bool compare(T? previous, T? current) {
  8. return previous == current;
  9. }
  10. }
  11. class PublishNotifier<T> extends ChangeNotifier {
  12. T? _value;
  13. Comparable<T>? comparable = ObjectComparable();
  14. PublishNotifier({this.comparable});
  15. set value(T newValue) {
  16. if (comparable != null) {
  17. if (comparable!.compare(_value, newValue)) {
  18. _value = newValue;
  19. notifyListeners();
  20. }
  21. } else {
  22. _value = newValue;
  23. notifyListeners();
  24. }
  25. }
  26. T? get currentValue => _value;
  27. void addPublishListener(void Function(T) callback, {bool Function()? listenWhen}) {
  28. super.addListener(
  29. () {
  30. if (_value == null) {
  31. return;
  32. }
  33. if (listenWhen != null && listenWhen() == false) {
  34. return;
  35. }
  36. callback(_value!);
  37. },
  38. );
  39. }
  40. }