Provider.of(context, listen: false) 是不是等同于 context.read()?

Posted

技术标签:

【中文标题】Provider.of(context, listen: false) 是不是等同于 context.read()?【英文标题】:Is Provider.of(context, listen: false) equivalent to context.read()?Provider.of(context, listen: false) 是否等同于 context.read()? 【发布时间】:2020-09-27 02:57:14 【问题描述】:
// Are these the same?
final model = Provider.of<Model>(context, listen: false); 
final model = context.read<Model>(); 

// Are these the same?
final model = Provider.of<Model>(context);
final model = context.watch<Model>();

它们是否相同?如果是,那么当我在 build() 方法中使用 readProvider.of() 有效时,为什么会出现此错误?

尝试在build 方法或提供者的update 回调中使用context.read&lt;Model&gt;

【问题讨论】:

【参考方案1】:

final model = context.read&lt;Model&gt;(); 这将返回模型而不监听任何更改。

final model = context.watch&lt;Model&gt;(); 这使小部件侦听模型上的更改。

final model = Provider.of&lt;Model&gt;(context, listen: false); 这与context.read&lt;Model&gt;(); 的作用相同

final model = Provider.of&lt;Model&gt;(context); 这与context.watch&lt;Model&gt;(); 的作用相同

建议: 使用context.read()context.watch() 而不是Provider.of()更多见解,请参阅this、this 和this。

【讨论】:

我相信您在回答之前必须仔细阅读问题。 -1 来自我,对不起!!! 没有在Provider.of()中指定时listen = true的默认值。如果要获取更新的数据,则必须使用“watch”代替或“read”。 一是我没有询问listen的默认值,二是我不想获取更新后的数据。我再次建议您在回答之前仔细阅读问题。谢谢 我没有。您能否分享任何您想要实现的目标以及您目前正在获得的示例?似乎这个问题会导致一些误解。如果可能的话! 嗯,我目前使用 FirebaseAuth 作为我的模型,当我使用 Provider.of(...)listen: false 时,它可以工作,但是当我使用 read 时,它会失败。【参考方案2】:

嗯,它们不一样。

您不应该在build 方法中使用read。而是坚持旧有黄金模式:

final model = Provider.of<Model>(context, listen: false); 

read 用于当您想在回调中使用上述模式时,例如,当按下按钮时,我们可以说它们都在执行相同的操作。

onPressed: () 
  final model = context.read<Model>(); // recommended
  final model = Provider.of<Model>(context, listen: false); // works too

【讨论】:

现在有趣的是,为什么文档建议不要在构建方法中使用 context.read() .... @Wecherowski 在this 的回答中,Remi 解释了为什么不能在构建方法中使用context.read。但我必须说我不相信它。【参考方案3】:

context.read&lt;T&gt;() 内部返回Provider.of&lt;T&gt;(context, listen: false)

目前,使用您认为最好的或您喜欢的。

这是在Provider中读取的实现:

extension ReadContext on BuildContext 
  T read<T>() 
    return Provider.of<T>(this, listen: false);
  

【讨论】:

以上是关于Provider.of(context, listen: false) 是不是等同于 context.read()?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Provider:为啥在调用 Provider.of<Widget>(context) 时会出现此错误,如 tihis:

如何对访问 Provider.of(context) 的小部件进行 Flutter 测试

如何将 get_it 用于 Provider.of<ExampleProvider>(context)?

在dispose()方法内部调用带有Provider.of(context)的方法会导致“查找已停用的小部件的祖先是不安全的。”

Flutter之跨组件状态共享Provider剖析

Flutter之跨组件状态共享Provider剖析