9

在 Riverpod文档中它说:

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

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

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

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

但随后它说:

警告

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

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

4

1 回答 1

6

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

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

于 2020-10-10T09:57:46.620 回答