构建方法中 Flutter Riverpod context.read vs Provider
Posted
技术标签:
【中文标题】构建方法中 Flutter Riverpod context.read vs Provider【英文标题】:Flutter Riverpod context.read vs Provider in the build method 【发布时间】:2021-01-25 06:00:14 【问题描述】:在 Riverpod documentation 它说:
这就是
context.read(myProvider)
的解决方案。使用它,我们可以将之前的代码重构为:
@override Widget build(BuildContext context) return RaisedButton( onPressed: () => context.read(counterProvider).state++, child: Text('increment'), );
通过这样做,点击我们的按钮仍然会增加计数器。但我们不再听 提供程序,避免不必要的重建。
然后它说:
注意
避免在 Widget 的
build
方法内调用context.read
。如果你 想要优化重建,提取在 Provider 中监听的值 而是。
这让我有点困惑。首先,文档给出了在build
方法中使用context.read
的示例,然后给出了避免它的警告。为什么?
【问题讨论】:
这能回答你的问题吗? Flutter Riverpod - using read() inside build method 【参考方案1】:在布局期间可以多次调用build
方法。因此你应该避免在它里面做任何额外的工作(比如在你的模型上调用一个方法)。
然而,RaisedButton
的 onPressed
回调实际上并没有在调用 build
时被调用。 onPressed
仅在用户按下按钮时调用。只有这样,Riverpod 才会读取您的提供程序并调用模型上的方法。所以文档中的警告不适用于这种情况。
【讨论】:
你知道extract the value listened in a Provider instead
的例子是什么样的吗?在我看来,如果从小部件内部读取,他们似乎总是在构建方法中读取提供程序。我看不出在构建方法中使用watch
是一个更好的解决方案。是否意味着在小部件内部使用 ProviderContainer().read(),但在构建方法之外?
@BeniaminoBaggins,这是个好问题。我自己也有点不清楚。以上是关于构建方法中 Flutter Riverpod context.read vs Provider的主要内容,如果未能解决你的问题,请参考以下文章