何时在Flutter中使用Provider.of <X>与Consumer <X>


13

我仍然在扑朔迷离地围绕状态管理技术,对何时何地使用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>?前者不会更新UI,后者会更新吗?
  2. 如果listen未设置为,false则默认情况下将重新构建小部件还是不重新构建?如果listen设置为true怎么办?
  3. 为什么要Provider.of选择完全重建UI的选项Consumer呢?

Answers:


17

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

Provider.of是获取和收听对象的唯一方法。 ConsumerSelector以及所有* ProxyProvider调用Provider.of可以正常工作。

Provider.ofvs Consumer是个人喜好问题。但是两者都有一些争论

提供者

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

消费者

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

这是有帮助的。我将接受此回复,尤其是对于其他人。但是您可以指向此语句的参考吗:“ Provider.of是获取和侦听对象的唯一方法。使用者,Selector和所有* ProxyProvider都调用Provider.of才能起作用。” 这不是我在文档中看到的东西,它确实对我有所帮助!
Oprimus

2
这只是消费者/ ...工作原理的实现细节。这是来源。你可以看到,Consumer基本上没有什么,但Provider.of在一个新的窗口小部件
雷米Rousselet

是否有关于学习防止BuildContext滥用的资源?
吴强福
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.