我仍然对状态管理技术犹豫不决,并对何时以及为什么使用Provider.of<X>Consumer<X>感到有点困惑.我从documentation中了解到(我认为)当您在这两者之间进行 Select 时,当我们想要访问数据时,您会使用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

这就引出了几个问题:

  1. 这是区分Provider.of<X>Consumer<X>的正确方式吗?前者不更新UI,后者更新吗?
  2. 如果listen未设置为false,小部件将默认重建还是不重建?如果将listen设置为true怎么办?
  3. 当我们有Consumer个用户界面时,为什么有Provider.of个用户可以 Select 重建用户界面呢?

推荐答案

无所谓.但要快速解释一下:

Provider.of是获取和侦听对象的only种方式. 消费者Selector和所有*ProxyProvider调用Provider.of才能工作.

Provider.of消费者是个人喜好问题.但这两种观点都有一些论据

Provider.of

  • 可以在所有小部件生命周期中调用,包括单击处理程序和didChangeDependencies
  • 不会增加缩进

消费者

  • 允许更细粒度的小部件重建
  • 解决了大多数构建上下文误用问题

Flutter相关问答推荐

当第二页在单独的小工具中使用Navigator.pop时,Navigator.push不起作用

如何知道当前屏幕是否处于抖动状态?

修复后期变量的抖动皮棉

ReCAPTCHA Enterprise中的严重安全漏洞

如何在Date Time类中只显示日期?

Flutter Android Google Sign-in error:ApiException:10在确认软件包名称、SHA-1 fingerprint 和设置同意页面后出现异常

如何在列表视图生成器中显示图像

在使用 Android 12+ 的真实 Android 设备上,SingleChildScrollView 中最初位于视口之外的无响应 Web 视图

如何从列表中更新provider变量:Flutter列表和Provider优化指南

不使用 GlobalKey 仍然收到 GlobalKey 被多次使用的错误

我可以在列表图块下方添加其他小部件吗

Firebase Auth - 有没有办法为新用户预先生成 UID?

Flutter - 我需要显示文本,但应用程序不需要

Flutter canvas 绘制不同 colored颜色 的原始点

无法在 flutter 中更新 void 方法内的变量值

如何在 ListView.builder 中扩展文本?

如何在dart中编写多个条件?

我收到这个错误我无法解决

检索 api 的值时,我得到_TypeError(类型'Null'不是'String'类型的子类型)

如何使用我拥有的 .jks 文件签署我的应用程序