【发布时间】:2021-09-21 04:59:52
【问题描述】:
根据 Flutter 的文档和 this example,据我了解,Provider 包的 context.read<T> 和 context.watch<T> 方法之间的关键区别与触发小部件重建有关。您可以在任何小部件的 build 方法中调用 context.watch<T>() 以访问当前状态,并在状态发生变化时要求 Flutter 重建您的小部件。您不能在构建方法之外使用context.watch<T>(),因为这通常会导致细微的错误。相反,他们说,使用context.read<T>(),它会获取当前状态,但不会询问 Flutter 未来的重建。
我尝试制作这个简单的应用程序:
class MyDataNotifier extends ChangeNotifier {
String _testString = 'test';
// getter
String get testString => _testString;
// update
void updateString(String aString) {
_testString = aString;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (_) => MyDataNotifier(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(context.read<MyDataNotifier>().testString),
),
body: Container(
child: Level1(),
),
),
);
}
}
class Level1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
onChanged: (val) {
context.read<MyDataNotifier>().updateString(val);
},
),
Text(context.read<MyDataNotifier>().testString),
],
);
}
}
所有电话都是counter.read<T>()。应用程序的状态发生变化,但 UI 不会使用新值重新构建。我必须将其中一个调用更改为 counter.watch<T>() 才能重建状态。
另一方面,在DZone's simple example 中,UI 重新构建,并且所有调用都对 context.read()。
他们的代码和我的有什么不同?为什么我不能用 counter.read() 调用重建?
【问题讨论】:
标签: flutter dart flutter-provider state-management