为什么我不能在build()中使用context.read,但是我可以将Provider.of与listen:false?

问题描述 投票:0回答:1

在文档中有说明,它们是相同的,context.read只是Provider.of(context,listen:false)的快捷方式。如果我尝试在build方法中使用context.read,则控制台中也会出现错误,但是它没有解释原因。

我也找到了这个主题:Is Provider.of(context, listen: false) equivalent of context.read()?但是它没有回答“为什么”。

flutter dart provider
1个回答
1
投票
  • [context.read不允许在build中使用,因为在此使用非常危险,并且有更好的解决方案。

  • 为了向后兼容,在Provider.of中允许
  • build

总体上,context.read中解释了为什么不允许在build中使用its documentation的原因:

<< [DO N'T在构建内调用[read],如果该值仅用于事件:

Widget build(BuildContext context) { // counter is used only for the onPressed of RaisedButton final counter = context.read<Counter>(); return RaisedButton( onPressed: () => counter.increment(), ); }
虽然此代码本身没有错误,但这是一种反模式。  重构小部件后,将来很容易导致错误  将counter用于其他用途,但忘记将[read]更改为[watch]。    

CONSIDER

在事件处理程序中调用[read]: Widget build(BuildContext context) { return RaisedButton( onPressed: () { // as performant as the previous previous solution, but resilient to refactoring context.read<Counter>().increment(), }, ); }
[与以前的反模式具有相同的效率,但没有  易碎的缺点。    

DO N'T

使用[read]创建值永远不变的小部件 Widget build(BuildContext context) { // using read because we only use a value that never changes. final model = context.read<Model>(); return Text('${model.valueThatNeverChanges}'); }
而如果发生其他变化,则不重建窗口小部件的想法是  很好,这不应该用[read]完成。  依靠[read]进行优化非常脆弱且依赖  详细说明。    

CONSIDER

使用[select]过滤不需要的重建 Widget build(BuildContext context) { // Using select to listen only to the value that used final valueThatNeverChanges = context.select((Model model) => model.valueThatNeverChanges); return Text('$valueThatNeverChanges'); }
虽然比[read]更详细,但使用[select]更安全。  它不依赖于Model上的实现细节,它使得  无法出现无法刷新用户界面的错误。
© www.soinside.com 2019 - 2024. All rights reserved.