构建方法中的 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
方法在布局时可以多次调用。因此你应该避免在其中做任何额外的工作(比如在你的模型上调用一个方法)。
但是,RaisedButton
的 onPressed
回调在调用 build
时实际上并未被调用。 onPressed
仅在用户按下按钮时调用。只有这样,Riverpod 才会读取您的提供程序并调用模型上的方法。所以文档中的警告不适用于那种情况。
在 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 thebuild
method of a Widget. If you want to optimize rebuilds, extract the value listened in a Provider instead.
这让我有点困惑。首先,文档给出了在 build
方法中使用 context.read
的示例,然后它给出了避免它的警告。为什么?
build
方法在布局时可以多次调用。因此你应该避免在其中做任何额外的工作(比如在你的模型上调用一个方法)。
但是,RaisedButton
的 onPressed
回调在调用 build
时实际上并未被调用。 onPressed
仅在用户按下按钮时调用。只有这样,Riverpod 才会读取您的提供程序并调用模型上的方法。所以文档中的警告不适用于那种情况。