如何在多个小部件上确定提供程序的范围,而不将提供程序放在颤振中的根小部件上

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)

  • 您好,Abhinav 欢迎来到社区并感谢您的回答。我想避免将所有状态放置在根小部件上,因为这将是一个不可取的全局状态。除非登录,否则我也不想创建“ItemRepository”。例如,“ItemRepository”构造函数在创建之前可能需要一个身份验证标头。 (6认同)