Provider和ChangeNotifierProvider之间的区别

时间:2020-07-06 06:45:52

标签: flutter dart

这两个小部件之间的区别是什么?在每个ChangeNotifier中使用Provider的必要性是什么?或者有很多使用Provider的方法?

1 个答案:

答案 0 :(得分:3)

提供程序在小部件树中公开一个值,以便子代可以访问它,而无论其位置在哪里(但仍必须在提供程序下方至少一层)。通常,您使用提供程序将“缓存”公开给一系列小部件,或者作为一种在多个页面之间共享数据的巧妙方法。请注意:

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

  • 如果通过提供程序公开的类与ChangeNotifier混合使用,则可以在发生更改时重建侦听器。

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


示例1-(无ChangeNofitier)

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

class MyDataHolder {
  int _value = 0;

  void updateValue(int a) {
    _value = a;
  }
}

然后执行以下操作:

Provider<MyDataHolder>(
  create: (_) => MyDataHolder(),
  child: MyWidgetWithTabs(),
)

通过这种方式,您可以轻松地在页面之间共享数据

示例2-(带有ChangeNotifier)

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

class MyDataHolder with ChangeNotifier {
  int _value = 0;

  void updateValue(int a) {
    _value = a;
    notifyListeners();
  }
}

现在,孩子们在听变化。与以前不同,调用updateValue时将重建侦听器。


因此,两种方法都不错,但目的却不同。如果您不需要为响应更新而重建一系列的侦听器,那就不要使用ChangeNotifier