如何解决如何在不将提供者放在 flutter 中的根小部件上的情况下,在多个小部件上确定提供者的范围
我正在开发一个简单的演示,其中用户登录、查看项目列表、点击项目,然后查看其详细信息。这是 3 个屏幕,但假设有两个流程,一个处理登录,另一个处理项目。
我正在使用 provider
包管理我的状态。我在我的根小部件上放置了一个 LoginRepository
提供程序,因为到处都需要该状态。这很好用。
现在我需要一个 ItemRepository
,它应该在 ItemListScreen
和 ItemDetailScreen
上可用。为了实现该范围,我决定创建一个名为 ItemScreens
的公共祖先小部件。这是我放置提供程序和嵌套 Navigator
的位置。
我使用 Navigator.of(context)
导航我的屏幕以确保使用 closes 祖先导航器。我使用 Provider.of<ItemRepository>(context)
获取我的提供者以确保使用 closes 祖先状态。
这显然不起作用,因为我得到了 Could not find the correct provider
。我知道来自兄弟路由的提供者不能被另一个兄弟访问,但在这里我嵌套导航器我希望 ItemRepository
被放置在 ItemScreens
然后处理子路由,以便这两条路由可以从父路由获取提供者?
旁注:
Flutter documentation 明确指出应取消提供程序以实现适当的范围。但是我从未见过将提供程序提升到非根小部件的示例。如果我们所能做的只是将提供程序放入根小部件中,则应明确说明。
编辑:在多个小部件上重新创建提供程序是一种替代方法,但这并不是真正的范围,它只是按值进行伪传递。
编辑:使用 MultiProvider
将所有提供程序放在根小部件上并不是一个好主意,因为它会创建一个全局状态反模式。除非需要,即用户正在访问该流程/屏幕,否则也不应该创建某些状态。
解决方法
您可以使用 Multiprovider 将 MaterialApp Widget 包装在 main.dart 中,并提供您正在使用的提供程序列表,这样应用程序就知道将哪个类视为提供程序。
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => FirstProvider(),),ChangeNotifierProvider(
create: (_) => SecondProvider(),],child: MaterialApp(
debugShowCheckedModeBanner: false,title: 'Auro',home: _decideMainPage(context),// routes: routes,theme: AllCoustomTheme.getThemeData(),)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。