簡體   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