DON'T如果该值仅用于事件,则在构建中调用 [read]:
Widget build(BuildContext context) {
// counter is used only for the onPressed of RaisedButton
final counter = context.read<Counter>();
return RaisedButton(
onPressed: () => counter.increment(),
);
}
虽然这段代码本身没有缺陷,但这是一种反模式。
重构widget以后很容易导致bug
使用counter
其他事情,但忘记将[阅读]更改为[观看]。
CONSIDER在事件处理程序中调用 [read]:
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
// as performant as the previous previous solution, but resilient to refactoring
context.read<Counter>().increment(),
},
);
}
这与之前的反模式具有相同的效率,但不
具有易碎的缺点。
DON'T使用 [read] 创建值永不改变的小部件
Widget build(BuildContext context) {
// using read because we only use a value that never changes.
final model = context.read<Model>();
return Text('${model.valueThatNeverChanges}');
}
虽然如果其他内容发生变化,则不重建小部件的想法是
很好,这不应该用[阅读]来完成。
依赖[阅读]进行优化是非常脆弱和依赖的
关于实施细节。
CONSIDER使用 [select] 过滤不需要的重建
Widget build(BuildContext context) {
// Using select to listen only to the value that used
final valueThatNeverChanges = context.select((Model model) => model.valueThatNeverChanges);
return Text('$valueThatNeverChanges');
}
虽然比 [read] 更详细,但使用 [select] 更安全。
它不依赖于实现细节Model
,这使得
不可能出现 UI 不刷新的错误。