首页 > 解决方案 > 何时使用 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

所以这给我带来了几个问题:

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

标签: flutterdartflutter-provider

解决方案


没关系。但是要快速解释一下:

Provider.of是获取和收听对象 的唯一方法。Consumer, Selector, 和所有 *ProxyProvider 调用Provider.of都可以工作。

Provider.ofvsConsumer是个人喜好问题。但两者都有一些论据

提供者.of

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

消费者

  • 允许更精细的小部件重建
  • 解决大多数 BuildContext 误用

推荐阅读