这两个小部件之间的区别是什么?在每个ChangeNotifier
中使用Provider
的必要性是什么?或者有很多使用Provider
的方法?
答案 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
。