构建方法中的 Flutter Riverpod context.read vs Provider

Sur*_*gch 8 flutter flutter-provider riverpod

在 Riverpod文档中,它说:

context.read(myProvider)就是解决方案的地方。

使用它,我们可以将之前的代码重构为:

@override 
Widget build(BuildContext context) {   
  return RaisedButton(
    onPressed: () => context.read(counterProvider).state++,
    child: Text('increment'),
  ); 
} 
Run Code Online (Sandbox Code Playgroud)

通过这样做,点击我们的按钮仍然会增加计数器。但是我们不再听取提供者的意见,这避免了不必要的重建。

但后来它说:

警告

避免context.readbuildWidget的方法内部调用。如果要优化重建,请提取在 Provider 中侦听的值。

这让我有点困惑。首先,文档给出了context.readbuild方法内部使用的示例,然后给出了避免它的警告。为什么?

Sur*_*gch 6

build方法可以在布局期间多次调用。因此你应该避免在其中做任何额外的工作(比如在你的模型上调用一个方法)。

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