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

Flutter Riverpod context.read vs Provider in the build method

在 Riverpod documentation 中说:

That's where context.read(myProvider) is a solution.

Using it, we could refactor our previous code to:

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

By doing so, clicking on our button still increments the counter. But we are no-longer listening to the provider, which avoids unnecessary rebuilds.

但它接着说:

caution

Avoid calling context.read inside the build method of a Widget. If you want to optimize rebuilds, extract the value listened in a Provider instead.

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

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

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