Flutter Provider 与全局变量

问题描述 投票:0回答:1

在主文件中定义的全局变量之上使用 Provider(在简单的应用程序中)的原因是什么? 调用 Provider 必须嵌入到 Build 方法中,因此可以直接访问全局变量,前提是导入了 main

如果变量发生更改,调用 Provider 的小部件是否会以某种方式自动标记为重建?

到目前为止,我同时使用提供者和直接访问来了解差异

flutter provider
1个回答
0
投票

如果变量发生更改,调用 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
,并且对于全局变量,您需要创建一个新变量。

请仔细阅读以下内容,以更好地了解它们的内部工作原理:

© www.soinside.com 2019 - 2024. All rights reserved.