【问题标题】: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;

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案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()更多见解,请参阅thisthisthis

    【讨论】:

    • 我相信您在回答之前必须仔细阅读问题。 -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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2021-10-18
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多