消费者和上下文.在MultiProvider中观看



我第一次尝试Flutter,我对MultiProvider类有点困惑。

这个问题很简单,但是我没有找到一个解释:

何时使用Consumer,何时使用context.watch?

例如,以我发现的一个示例应用程序为例,我尝试使用两个提供商来提供两个全局状态,主题和应用程序的状态:

runApp(
MultiProvider(providers: [
ChangeNotifierProvider(create: (context) => AppTheme()),
ChangeNotifierProvider(create: (context) => AppStatus()),
],
child: const MyApp()
));

然后应用程序小部件使用Consumer:

访问主题
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<AppTheme>(
builder: (context, appTheme, child) {
// ...

据我所知,现在所有的子部件都将继承提供者。对吗?

我的主页,然后,由MyApp类调用的使用Consumer,但context.watch:
@override
Widget build(BuildContext context) {
final appTheme = context.watch<AppTheme>();
final appStatus = context.watch<AppStatus>();
return NavigationView( 
// ...

它工作,不要误会我,但我只是复制了我的appStatus上面的行,所以我真的不完全理解它。这也是由于我调制的另一个屏幕来访问AppStatus全局状态,但我使用Consumer,正如Flutter文档所建议的那样:

class _ViewerState extends State<Viewer> {
@override
Widget build(BuildContext context) {
return Consumer<AppStatus>(
builder: (context, appStatus, child) {
return ScaffoldPage.scrollable(
header: const PageHeader(title: Text('Test')),
children: [
FilledButton(child: Text("Try ${appStatus.count}"), onPressed: (){ appStatus.increment(); debugPrint('pressed ${appStatus.count}'); }),
FilledButton(child: Text("Reset"), onPressed: (){ appStatus.reset(); }),
]);
},
);
}
}

我感觉我在这里滥用了什么东西,我真的不明白引擎盖下发生了什么…

context.watch<T>()Consumer<T>做同样的事情。大多数情况下,context.watch<T>()只是更方便。在某些情况下,context不可用的Consumer<T>是有用的。

最新更新