blob: 178fc99b005ec0bf47473915642a81c82f057cf5 [file] [log] [blame]
import 'dart:math' as math;
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
/// List that notifies listeners on change.
class ChangeNotifierList<E> extends DelegatingList<E> with ChangeNotifier {
/// Creates a new ChangeNotifierList, using baseList as the backing if
/// included, otherwise constructing a new list.
ChangeNotifierList([List<E> baseList]) : super(baseList ?? []);
@override
void operator []=(int index, E value) {
if (super[index] != value) {
super[index] = value;
notifyListeners();
}
}
@override
void add(E value) {
super.add(value);
notifyListeners();
}
@override
void addAll(Iterable<E> iterable) {
super.addAll(iterable);
notifyListeners();
}
@override
void clear() {
super.clear();
notifyListeners();
}
@override
void fillRange(int start, int end, [E fillValue]) {
super.fillRange(start, end, fillValue);
notifyListeners();
}
@override
void insert(int index, E element) {
super.insert(index, element);
notifyListeners();
}
@override
void insertAll(int index, Iterable<E> iterable) {
super.insertAll(index, iterable);
notifyListeners();
}
@override
set length(int newLength) {
if (length != newLength) {
super.length = newLength;
notifyListeners();
}
}
@override
bool remove(Object value) {
final returnValue = super.remove(value);
if (returnValue) {
notifyListeners();
}
return returnValue;
}
@override
E removeAt(int index) {
final returnValue = super.removeAt(index);
notifyListeners();
return returnValue;
}
@override
E removeLast() {
final returnValue = super.removeLast();
notifyListeners();
return returnValue;
}
@override
void removeRange(int start, int end) {
super.removeRange(start, end);
notifyListeners();
}
@override
void removeWhere(bool test(E element)) {
super.removeWhere(test);
notifyListeners();
}
@override
void replaceRange(int start, int end, Iterable<E> iterable) {
super.replaceRange(start, end, iterable);
notifyListeners();
}
@override
void retainWhere(bool test(E element)) {
super.retainWhere(test);
notifyListeners();
}
@override
void setAll(int index, Iterable<E> iterable) {
super.setAll(index, iterable);
notifyListeners();
}
@override
void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
super.setRange(start, end, iterable, skipCount);
notifyListeners();
}
@override
void shuffle([math.Random random]) {
super.shuffle(random);
notifyListeners();
}
@override
void sort([int compare(E a, E b)]) {
super.sort(compare);
notifyListeners();
}
}
/// Map that provides notification when changed.
class ChangeNotifierMap<K, V> extends DelegatingMap<K, V> with ChangeNotifier {
/// Constructs a new [ChangeNotifierMap] using the base map as backing
/// or a new map if none was provided.
ChangeNotifierMap([Map<K, V> base]) : super(base ?? <K, V>{});
@override
void operator []=(K key, V value) {
if (this[key] != value) {
super[key] = value;
notifyListeners();
}
}
@override
void addAll(Map<K, V> other) {
super.addAll(other);
notifyListeners();
}
// TODO: When addEntries is supported by [DelegatingMap], enable this.
@override
void addEntries(Iterable<Object> entries) {
super.addEntries(entries);
notifyListeners();
}
@override
void clear() {
super.clear();
notifyListeners();
}
@override
V putIfAbsent(K key, V ifAbsent()) {
final isAbsent = containsKey(key);
final returnValue = super.putIfAbsent(key, ifAbsent);
if (isAbsent) {
notifyListeners();
}
return returnValue;
}
@override
V remove(Object key) {
final returnValue = super.remove(key);
notifyListeners();
return returnValue;
}
@override
void removeWhere(bool test(K key, V value)) {
super.removeWhere(test);
notifyListeners();
}
@override
V update(K key, V update(V value), {V ifAbsent()}) {
final returnValue = super.update(key, update, ifAbsent: ifAbsent);
notifyListeners();
return returnValue;
}
@override
void updateAll(V update(K key, V value)) {
super.updateAll(update);
notifyListeners();
}
}