构建方法中 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 方法。因此你应该避免在它里面做任何额外的工作(比如在你的模型上调用一个方法)。

然而,RaisedButtononPressed 回调实际上并没有在调用 build 时被调用。 onPressed 仅在用户按下按钮时调用。只有这样,Riverpod 才会读取您的提供程序并调用模型上的方法。所以文档中的警告不适用于这种情况。

【讨论】:

你知道extract the value listened in a Provider instead 的例子是什么样的吗?在我看来,如果从小部件内部读取,他们似乎总是在构建方法中读取提供程序。我看不出在构建方法中使用watch 是一个更好的解决方案。是否意味着在小部件内部使用 ProviderContainer().read(),但在构建方法之外? @BeniaminoBaggins,这是个好问题。我自己也有点不清楚。

以上是关于构建方法中 Flutter Riverpod context.read vs Provider的主要内容,如果未能解决你的问题,请参考以下文章

Flutter状态管理之Riverpod

Flutter状态管理之Riverpod 2.0

Flutter状态管理之Riverpod 2.0

Flutter状态管理之Riverpod 2.0

使用 RiverPod 状态管理 Flutter 更改 Text 值

Flutter 用 provider 和 riverpod 制作表单