针对大量侦听器优化的ChangeNotifier的替代方案?

时间:2019-12-28 21:58:36

标签: flutter

ChangeNotifier的Flutter文档说

  

ChangeNotifier针对少量(一两个)侦听器进行了优化。用于添加和删除侦听器的O(N),用于调度通知的O(N²)(其中N是侦听器的数量)。

如果我要设计一个模型,其中会有许多侦听器(例如数十个侦听器),是否可以在Flutter中使用替代类?

理想情况下,我正在寻找小于O(N ^ 2)的东西来调度通知,其中N是侦听器的数量。

1 个答案:

答案 0 :(得分:2)

有趣的是,当我查看最新的代码/文档时,它现在已经优化了!

它说 (2021.01):

<块引用>

添加侦听器为 O(1),移除侦听器和分发通知为 O(N)(其中 N 为侦听器数量)。

这样我们就可以愉快地使用它了。是啊!

为什么会这样:查看源代码

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

我们看到它遍历侦听器并调用它们。

在过去,甚至说 flutter 1.21,source code 看起来像:

  void notifyListeners() {
    assert(_debugAssertNotDisposed());
    if (_listeners != null) {
      final List<VoidCallback> localListeners = List<VoidCallback>.from(_listeners!);
      for (final VoidCallback listener in localListeners) {
        try {
          if (_listeners!.contains(listener))
            listener();
        } catch (exception, stack) {
          ...
        }
      }
    }
  }

因此你看,在过去有双循环(一个 for 循环 + 一个包含检查),而在新的日子里没有。