ChangeNotifier

160 阅读1分钟

一、定义

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) {
       
        }
    }
}

四、总结

该类实现了一个基础机制:

  • 注册、删除回调
  • 合适的时候执行回调