一、定义
class ChangeNotifier implements Listenable {
LinkedList<_ListenerEntry>? _listeners = LinkedList<_ListenerEntry>();
}
实现了Listenable协议,_listeners是一个双链表,存储着回调。
二、注册、删除回调
注册一个回调,当数据改变的时候调用
@override
void addListener(VoidCallback listener) {
assert(_debugAssertNotDisposed());
_listeners!.add(_ListenerEntry(listener));
}
删除一个回调
@override
void removeListener(VoidCallback listener) {
assert(_debugAssertNotDisposed());
for (final _ListenerEntry entry in _listeners!) {
if (entry.listener == listener) {
entry.unlink(); // 双链表的删除节点
return;
}
}
}
三、通知机制
@protected
@visibleForTesting
void notifyListeners() {
assert(_debugAssertNotDisposed());
if (_listeners!.isEmpty)
return;
final List<_ListenerEntry> localListeners = List<_ListenerEntry>.from(_listeners!);
for (final _ListenerEntry entry in localListeners) {
try {
if (entry.list != null)
entry.listener();// 调用回调
} catch (exception, stack) {
}
}
}
四、总结
该类实现了一个基础机制:
- 注册、删除回调
- 合适的时候执行回调