【问题标题】:How do I use ChangeNotifier?如何使用 ChangeNotifier?
【发布时间】:2020-02-07 06:28:28
【问题描述】:

从文档中我了解到,可以在 ChangeNotifier 实例上调用 addListener() 以向堆栈添加自定义侦听器。

此方法接受零参数的回调(根据notifyListeners()),例如:

class MyClass extends ChangeNotifier {

  MyClass() {
    addListener(() {
      // ...
    });
  }
}

从回调中,如何找出MyClass 的哪些属性或部分已更改?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    ChangeNotifier 天生就没有这种能力。您将必须实现自己的逻辑。具体来说,您要么可以访问 ChangeNotifier 实现的所有属性,因为您在其作用域中添加了侦听器,要么您可以访问它,因为您在作用域中有对它的引用。

    ChangeNotifier 只是实现了Listenable 并提供了一些用于管理侦听器的实用程序。此外,该文档说明了以下内容:

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

    我不确定用于通知侦听器的运行时复杂度更高的选项,但您不会在常规 Flutter 应用程序中遇到任何问题。

    值通知器

    ValueNotifierChangeNotifier 的预制实现,当其 value property 更改时将通知其侦听器。
    这对于大多数情况来说已经足够了,但由于您似乎想要创建自定义 ChangeNotifier,您可以使用 source code of ValueNotifier 来查看示例实现(非常简单)。


    如果您只是想进行一般的状态管理,ValueNotifiers 通常工作得很好。但是,它们并不适用于所有场景。因此,这是一个extensive list with different state management options
    考虑到这些问题,我认为最适合您需求和最受欢迎的技术如下:

    【讨论】:

    • 感谢您提供如此全面的答案。似乎 ValueNotifier 总是在设置新值时通知侦听器,无论新值是否与以前的值相同。比较当前值和新值,如果值相同则不重建小部件树是我一直在寻找的一种魔法
    • @Kaspi 如果值相同,它将不会重建。见this line from the source code I linked to in my answer
    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2021-04-10
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多