Spi*_*dey 11 flutter flutter-navigation flutter-provider
我正在开发一个简单的演示,用户登录,查看项目列表,单击项目,然后查看其详细信息。这是 3 个屏幕,但我们假设有两个流程,其中一个处理登录,另一个处理项目。
我正在使用包管理我的状态provider。我LoginRepository在我的根小部件上放置了一个提供程序,因为到处都需要该状态。这很好用。
现在我需要一个ItemRepository应该在ItemListScreen和 上可用的ItemDetailScreen。为了实现该范围,我决定创建一个名为 的共同祖先小部件ItemScreens。这是我放置提供程序和嵌套 Navigator.
我使用导航器来导航屏幕,Navigator.of(context)以确保使用了关闭的祖先导航器。我使用获取我的提供程序Provider.of<ItemRepository>(context)来确保使用关闭祖先状态。
这显然不起作用,因为我得到了Could not find the correct provider. 我知道来自同级路由的提供程序不能被另一个同级路由访问,但在这里我嵌套导航器,我希望将其ItemRepository放置在ItemScreens其中然后处理子路由,以便这两个路由可以从父路由获取提供程序?
旁注:
Flutter文档明确指出应提升提供程序以实现正确的范围界定。但我从未见过将提供程序提升为非根小部件的示例。如果我们所能做的就是将提供程序放入根小部件中,那么应该明确说明这一点。
编辑:在多个小部件上重新创建提供程序是一种替代方案,但这并不是真正的范围,它只是伪值传递。
编辑:将所有提供程序放在根小部件上MultiProvider并不是一个好主意,因为它创建了全局状态反模式。除非需要,即用户正在访问该流程/屏幕,否则不应创建某些状态。
小智 1
您可以使用 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(),
),
)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |