在Riverpod documentation中说:
这就是
context.read(myProvider)
是解决方案的地方。使用它,我们可以将之前的代码重构为:
@override Widget build(BuildContext context) { return RaisedButton( onPressed: () => context.read(counterProvider).state++, child: Text('increment'), ); }
这样做,单击我们的按钮仍会增加计数器。但是我们不再听 提供程序,避免不必要的重建。
但是它说:
注意
避免在Widget的
context.read
方法内调用build
。如果你 要优化重建,提取提供程序中侦听的值 代替。
这让我有些困惑。首先,文档提供了在context.read
方法内使用build
的示例,然后给出了避免使用该警告的警告。为什么?
答案 0 :(得分:3)
在布局期间可以多次调用build
方法。因此,您应该避免在其中进行任何额外的工作(例如在模型上调用方法)。
但是,在调用onPressed
时实际上并未调用RaisedButton
的{{1}}回调。 build
仅在用户按下按钮时被调用。只有这样,Riverpod才会读取您的提供程序并在模型上调用该方法。因此,文档中的警告不适用于这种情况。