繁体   English   中英

如何在 Flutter 中拆分提供者的 MultiProvider 列表?

[英]How to split a MultiProvider list of providers in Flutter?

我有一个以以下开头的应用程序:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final initFuture = MobileAds.instance.initialize();
  final adState = AdState(initFuture);

  runApp(
    MultiProvider(
      providers: [
        Provider<AdState>(create: (_) =>  adState),
        ChangeNotifierProvider(create: (_) => SomeNotifier1()),
        ChangeNotifierProvider(create: (_) => SomeNotifier2()),
        ChangeNotifierProvider(create: (_) => SomeNotifier3()),
        ChangeNotifierProvider(create: (_) => SomeNotifier4()),
        ChangeNotifierProvider(create: (_) => SomeNotifier5()),
        ChangeNotifierProvider(create: (_) => SomeNotifier6()),
        ChangeNotifierProvider(create: (_) => SomeNotifier7()),
        ChangeNotifierProvider(create: (_) => SomeNotifier8()),
        ChangeNotifierProvider(create: (_) => SomeNotifier9()),
        ChangeNotifierProvider(create: (_) => SomeNotifier10())
      ],
      child: const MyApp()
    ),
  );
}

并且出于测试原因,我想将providers列表拆分为多个列表,例如:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final initFuture = MobileAds.instance.initialize();
  final adState = AdState(initFuture);

  runApp(
    MultiProvider(
      providers: [
        Provider<AdState>(create: (_) =>  adState),
        ...list1(),
        ...list2()
      ],
      child: const MyApp()
    ),
  );
}

List<ChangeNotifierProvider<ChangeNotifier>> list1() =>
  [
    ChangeNotifierProvider(create: (_) => SomeNotifier1()),
    ChangeNotifierProvider(create: (_) => SomeNotifier2()),
    ChangeNotifierProvider(create: (_) => SomeNotifier3()),
    ChangeNotifierProvider(create: (_) => SomeNotifier4()),
    ChangeNotifierProvider(create: (_) => SomeNotifier5())
  ];

List<ChangeNotifierProvider<ChangeNotifier>> list2() =>
  [
    ChangeNotifierProvider(create: (_) => SomeNotifier6()),
    ChangeNotifierProvider(create: (_) => SomeNotifier7()),
    ChangeNotifierProvider(create: (_) => SomeNotifier8()),
    ChangeNotifierProvider(create: (_) => SomeNotifier9()),
    ChangeNotifierProvider(create: (_) => SomeNotifier10())
  ];

错误:在此消费者小部件上方找不到正确的提供者

发生这种情况是因为您使用的BuildContext不包括您选择的提供者。 有一些常见的情况:等等......

有没有办法将MultiProvider拆分为多个列表?

我也在尝试类似的东西:

return MultiProvider<Example>(
      create: (_) => Example(),
      builder: (context) {
        return Text(context.watch<Example>()),
      }
    ),

但到目前为止还没有运气。

您可以尝试将 BuildContext 参数添加到返回提供程序的函数中,如下所示

List<ChangeNotifierProvider<ChangeNotifier>> list1(BuildContext context) =>
  [
    ChangeNotifierProvider(create: (context) => SomeNotifier1()),
    ChangeNotifierProvider(create: (context) => SomeNotifier2()),
    ChangeNotifierProvider(create: (context) => SomeNotifier3()),
    ChangeNotifierProvider(create: (context) => SomeNotifier4()),
    ChangeNotifierProvider(create: (context) => SomeNotifier5())
  ];

List<ChangeNotifierProvider<ChangeNotifier>> list2(BuildContext context) =>
  [
    ChangeNotifierProvider(create: (context) => SomeNotifier6()),
    ChangeNotifierProvider(create: (context) => SomeNotifier7()),
    ChangeNotifierProvider(create: (context) => SomeNotifier8()),
    ChangeNotifierProvider(create: (context) => SomeNotifier9()),
    ChangeNotifierProvider(create: (context) => SomeNotifier10())
  ];

那么您现在可以像这样添加提供程序

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final initFuture = MobileAds.instance.initialize();
  final adState = AdState(initFuture);

  runApp(
    MultiProvider(
      providers: [
        Provider<AdState>(create: (_) =>  adState),
        ...list1(context),
        ...list2(context)
      ],
      child: const MyApp()
    ),
  );
}

这应该会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM