这两个小部件之间有什么区别以及它是否需要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.
| 归档时间: |
|
| 查看次数: |
2549 次 |
| 最近记录: |