在主文件中定义的全局变量之上使用 Provider(在简单的应用程序中)的原因是什么? 调用 Provider 必须嵌入到 Build 方法中,因此可以直接访问全局变量,前提是导入了 main
如果变量发生更改,调用 Provider 的小部件是否会以某种方式自动标记为重建?
到目前为止,我同时使用提供者和直接访问来了解差异
如果变量发生更改,调用 Provider 的小部件是否会以某种方式自动标记为重建?
是的!尽管可能并不完全是你想象的那样。
provider
的构建方式与框架中构建 InheritedWidget
的方式非常相似。当您调用其 of
方法(或 context.watch
)时,您真正要做的就是在小部件的 dependOnInheritedWidgetOfExactType
(您传递给它的上下文)上调用
BuildContext
。每当dependency(提供的小部件)changes调用didChangeDependencies
然后调用build
时,这都会注册要重建的小部件的元素。
如果您提供一个普通类,它不会得到 changed,除非您使用
Provider.value
并更改 value
中返回的对象。如果您提供带有 ChangeNotifier
的 ChangeNotifierProvider
,每当调用其上的 notifyListeners
时,它都会 改变,等等。
如果您使用原始
InheritedWidget
,您可以控制依赖项(调用 Provider.of
的小部件)何时使用 updateShouldNotify
布尔 getter 进行更新。
使用
provider
/InheritedWidget
时,您可以使用新的 Provider
/InheritedWidget
来包装小部件树,以更改将在树中提供的实例。当提供者从树中删除时,它还可以处理值的处理。对于全局变量,您必须手动执行此操作。此外,在小部件测试中,您必须自己设置和清理全局变量。要为不同的小部件树实例化同一类的多个实例,您只需使用一些 Provider
,并且对于全局变量,您需要创建一个新变量。
请仔细阅读以下内容,以更好地了解它们的内部工作原理: