ChangeNotifier的Flutter文档说
ChangeNotifier针对少量(一两个)侦听器进行了优化。用于添加和删除侦听器的O(N),用于调度通知的O(N²)(其中N是侦听器的数量)。
如果我要设计一个模型,其中会有许多侦听器(例如数十个侦听器),是否可以在Flutter中使用替代类?
理想情况下,我正在寻找小于O(N ^ 2)的东西来调度通知,其中N是侦听器的数量。
答案 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 循环 + 一个包含检查),而在新的日子里没有。