flutter - 何时使用 Provider.of与消费者在颤振中
问题描述
我仍在纠结于颤动的状态管理技术,并且对何时以及为什么使用Provider.of<X>
vs. Consumer<X>
. 我从文档中了解到(我认为),在这两者之间进行选择时,当我们想要访问数据时,您将使用 Provider.of,但您不需要更改 UI。因此,以下内容(取自文档)可以访问数据并在新事件上更新 UI:
return HumongousWidget(
// ...
child: AnotherMonstrousWidget(// <- This widget will rebuild on new data events
// ...
child: Consumer<CartModel>(
builder: (context, cart, child) {
return Text('Total price: ${cart.totalPrice}');
},
),
),
);
然而,如果我们只需要不想使用 UI 重建的数据,我们将使用Provider.of<X>
参数listen
设置为false
,如下所示:
Provider.of<CartModel>(context, listen: false).add(item); \\Widget won't rebuild
但是,listen
这不是必需的,因此以下内容也将运行:
Provider.of<CartModel>(context).add(item); \\listener optional
所以这给我带来了几个问题:
- 这是区分
Provider.of<X>
和的正确方法吗Consumer<X>
?前者不更新用户界面,后者呢? - 如果
listen
未设置为false
,小部件是默认重建还是不重建?如果listen
设置为true
怎么办? - 为什么
Provider.of
我们有重建 UI 的选项Consumer
?
解决方案
没关系。但是要快速解释一下:
Provider.of
是获取和收听对象
的唯一方法。Consumer
, Selector
, 和所有 *ProxyProvider 调用Provider.of
都可以工作。
Provider.of
vsConsumer
是个人喜好问题。但两者都有一些论据
提供者.of
- 可以在所有小部件生命周期中调用,包括点击处理程序和
didChangeDependencies
- 不增加缩进
消费者
- 允许更精细的小部件重建
- 解决大多数 BuildContext 误用
推荐阅读
- hadoop - Hadoop Nodemanager 失败并出现错误无法获取组信息
- azure - AAD 登录引发 NotImplementedException
- go - 将默认值设置为自定义序列
- javascript - 查找以两位数字和一个字母开头的字符串
- swift - 我想知道印刷中的分隔符和终结符有什么不同?
- java - 如何在 Java 中进行 SAML SSO 重定向
- jenkins - 无法访问 localhost/jenkins 上的 Jenkins
- java - 对随机生成的数字向量进行排序
- javascript - mongodb:无法使用谷歌云功能向 MongoDB Atlas 服务器插入许多
- codenameone - 设备未注册:从未注册的设备发送日志是不可能的设备上的错误消息