“ ValueNotifier” +“ ValueListenableBuilder”是否适合Flutter中的“许多”小部件?

时间:2019-12-29 13:21:15

标签: flutter dart widget

ValueNotifier可以与一个或多个ValueListenableBuilder结合使用以管理状态并简化UI的开发。

但是,ValueNotifier继承自ChangeNotifier,文档中指出:

  

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

因此,据我了解,最好不要让多个ValueListenableBuilder在同一个通知程序上进行监听。

相反,the official video presentation表示您可以同时更新许多小部件:

Many widgets

我的问题是:

  • 文档和视频之间没有矛盾吗?
  • 为什么通知是O(N²)而不是O(N)?
  • 我应该使用比ValueNotifier / ValueListenableBuilder更好的东西吗?

1 个答案:

答案 0 :(得分:1)

关于通知的复杂性:

通过阅读source code for ChangeNotifier来了解notifyListeners方法:在203行上执行for循环,并为每次迭代调用_listeners.contains

forcontains都具有O(N)的复杂性,并且由于contains在每次迭代中都被调用,所以这里有O(N²)的原因。

我认为视频和文档之间没有矛盾。 当您需要根据ValueNotifier的值更新几个小部件时,这种方法非常适合小情况。

对于更大的情况,您可以使用InheritedWidget,我相信它甚至在整个应用程序范围内也适合公开值(请参见Theme,MediaQuery),或者您可以使用BLOC方法,该方法利用Dart流

尽管进行了搜索,但并未找到有关建议方法的通知复杂性的特定信息。

我建议他们是因为我认为它们更适合复杂的情况,我可以通过我对它们的使用经验来支持。

通常,我将BLoC用于业务逻辑相关的状态管理,而InheritedWidget(特别是provider package)用于UI相关的状态管理。