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

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



因此,据我了解,在同一通知程序上侦听多个ValueListenableBuilder不是最佳实践。

另一方面,the official video presentation表示您可以同时更新许多小部件:

flutter - flut中的 “ValueNotifier”小部件适合 “ValueListenableBuilder” +  “many”吗?-LMLPHP

我的问题是:

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

    关于通知的复杂性:

    阅读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相关的状态管理。

    关于flutter - flut中的 “ValueNotifier”小部件适合 “ValueListenableBuilder” + “many”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59519798/

    10-10 17:56