我正在为Flutter使用provider软件包。我要实现的是为一个视图或页面提供一个简单的提供程序。因此,我在小部件中尝试了以下操作:
Widget build(BuildContext context) {
return ChangeNotifierProvider<MyModel>(
create: (_) => MyModel(),
child: Scaffold(
appBar: AppBar(
title: Text(
'Screen 1',
),
),
body: _buildBody(),
),
);
}
但是当我尝试在Provider.of<MyModel>(context, listen: false).value
方法中使用_buildBody()
访问提供程序时,出现错误:
在此MyPageWidget上方找不到正确的提供程序
当我将提供程序的声明移动到在此小部件上方声明我的App的位置时,它将起作用。不幸的是,这使提供商公开供我访问所有我不想要的视图。我该如何创建一个可以在该视图或窗口小部件中访问的提供程序。感谢您的帮助。
注意:我尝试过此answer,但仍得到相同的结果。
编辑:我可以在小部件树的顶部使用Consumer
,但是如果我的整个小部件树都在{中,那不会导致页面重建过多{1}}。此外,如果我需要使用Consumer
,怎么办?
答案 0 :(得分:1)
尝试用消费者包裹支架
Widget build(BuildContext context) {
return ChangeNotifierProvider<MyModel>(
create: (_) => MyModel(),
child: Consumer(
builder: (context, MyModel model, _) => Scaffold(
appBar: AppBar(
title: Text(
'Screen 1',
),
),
body: _buildBody(),
),
));
}
现在您可以通过将其传递给方法来直接访问我的模型
答案 1 :(得分:0)
我终于找到了解决此问题的方法,该方法不需要在发生类似@ GJJ2019 answer的更改时重建整个窗口小部件树。当我声明路线时,例如:
'/': (context) => MyScreen();
例如,我用MyScreen
包装ChangeNotifierProvider
:
'/': (context) => ChangeNotifierProvider<MyModel>(
create: (_) => MyModel(),
child: MyScreen()),
因此,与其在小部件/屏幕中声明正在使用的提供程序,不如在声明路由的地方声明提供程序。