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()
方法中使用 read
而 Provider.of()
有效时,为什么会出现此错误?
尝试在
build
方法或提供者的update
回调中使用context.read<Model>
。
【问题讨论】:
【参考方案1】:final model = context.read<Model>();
这将返回模型而不监听任何更改。
final model = context.watch<Model>();
这使小部件侦听模型上的更改。
final model = Provider.of<Model>(context, listen: false);
这与context.read<Model>();
的作用相同
final model = Provider.of<Model>(context);
这与context.watch<Model>();
的作用相同
建议:
使用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<T>()
内部返回Provider.of<T>(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)的方法会导致“查找已停用的小部件的祖先是不安全的。”