Provider 和 ChangeNotifierProvider 之间的区别

Ara*_*ein 10 dart flutter

这两个小部件之间有什么区别以及它是否需要ChangeNotifier在每个小部件中使用Provider或者有多种使用方法Provider

Alb*_*ola 15

提供程序在小部件树中公开一个值,以便子级可以访问它,无论其位置如何(但它们仍然必须至少比提供程序低一级)。通常,您使用提供程序将“缓存”公开给一系列小部件,或者作为跨多个页面共享数据的巧妙方式。注意:

  • 默认情况下,当读取存储在提供程序中的值时,不会发生任何事情。这意味着,如果您公开一个类并更改它的一些内部结构,孩子们将不会听它。

  • 如果您通过提供程序公开的类混合在一起,ChangeNotifier那么您就有可能在发生变化时重建侦听器。

您绝对不会ChangeNotifier被迫在提供者公开的模型类中使用。当您需要一些小部件来监听更改时使用它,但如果不是这种情况,请忽略它。


示例 1 -(无 ChangeNofitier)

您正在使用TabBarView来处理选项卡(假设您有 3 个页面),并且您的页面需要共享一些数据。不要使用Navigator可能会变得很麻烦的共享数据,而是选择提供商。

class MyDataHolder {
  int _value = 0;

  void updateValue(int a) {
    _value = a;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后做这样的事情:

Provider<MyDataHolder>(
  create: (_) => MyDataHolder(),
  child: MyWidgetWithTabs(),
)
Run Code Online (Sandbox Code Playgroud)

这样就可以轻松地在页面之间共享数据

示例 2 -(使用 ChangeNotifier)

仍然是上述情况,但如果您希望页面侦听特定数据的更改,请使用通知程序。像这样:

class MyDataHolder with ChangeNotifier {
  int _value = 0;

  void updateValue(int a) {
    _value = a;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在孩子们会聆听变化。与之前不同的是,调用时updateValue监听器会被重建。


所以这两种方式都很好,但目的不同。如果您不需要重建一系列侦听器以响应更新,则不要使用ChangeNotifier.