我仍然对状态管理技术犹豫不决,并对何时以及为什么使用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
这就引出了几个问题:
- 这是区分
Provider.of<X>
和Consumer<X>
的正确方式吗?前者不更新UI,后者更新吗? - 如果
listen
未设置为false
,小部件将默认重建还是不重建?如果将listen
设置为true
怎么办? - 当我们有
Consumer
个用户界面时,为什么有Provider.of
个用户可以 Select 重建用户界面呢?