繁体   English   中英

错误:找不到正确的提供者<themenotifier>在这个 VideosYou 小部件上方</themenotifier>

[英]Error: Could not find the correct Provider<ThemeNotifier> above this VideosYou Widget

当我尝试打开一个新的 main.dart 时出现此错误 例如:我需要从 main.dart 打开 main2.dart 但仍然显示 Provider(ThemeNotifier)

main.dart

MenuItem(
                      title: "Click".tr(),
                      onPressed: (){
                        Navigator.push(
                            context,
                            MaterialPageRoute(builder: (context) => Click())
                        );
                      },
                    ),
                    MenuItem(
                      title: "Extra".tr(),
                      onPressed: () {
                        Navigator.push(
                          context,
                          MaterialPageRoute(builder: (context) => MyApp2()),
                        );
                      },
                    ),

这是我的main2.dart

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Wakelock.enable();
  await Firebase.initializeApp(
   // options: DefaultFirebaseOptions.currentPlatform,
  );
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  await Hive.initFlutter();
  await Hive.openBox(authBox);
  await Hive.openBox(userDetailsBox);
  await Hive.openBox(settingsBox);
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
    statusBarColor: Colors.transparent,
    statusBarIconBrightness:
        DesignConfig.isDark ? Brightness.light : Brightness.dark,

    // status bar color
  ));
  final pushNotificationService = PushNotificationService(firebaseMessaging);
  //pushNotificationService.initialise();
  runApp(ChangeNotifierProvider<ThemeNotifier>(
      create: (BuildContext context) {
        String theme = SettingsLocalDataSource().theme();

        if (theme == StringRes.darkThemeKey) {
          ISDARK = "true";
        } else {
          ISDARK = "false";
        }
        var brightness = SchedulerBinding.instance.window.platformBrightness;
        ISDARK = (brightness == Brightness.dark).toString();
        return ThemeNotifier(theme == StringRes.lightThemeKey
            ? ThemeMode.light
            : ThemeMode.dark);
      },
      child: const MyApp2()));
}

class MyApp2 extends StatefulWidget {
  const MyApp2({Key key}) : super(key: key);

  @override
  State<MyApp2> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp2> {
  @override
  Widget build(BuildContext context) {
    final themeNotifier = Provider.of<ThemeNotifier>(context);
    return Shortcuts(
        shortcuts: <LogicalKeySet, Intent>{
          LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(),
        },
        child: MultiProvider(
            providers: [
              ChangeNotifierProvider(
                create: (_) => Provider1(),
              ),
              ChangeNotifierProvider(
                create: (_) => Provider2(),
              ),
              ChangeNotifierProvider(
                create: (_) => Provider3(),
              ),
              ChangeNotifierProvider(
                create: (_) => Provider4(),
              ),
              ChangeNotifierProvider(
                create: (_) => Provider5(),
              ),
            ],
            child: MaterialApp(
              builder: (context, widget) {
                return Directionality(
                    textDirection:
                        TextDirection.ltr, // set here your text direction
                    child: ScrollConfiguration(
                        behavior: GlobalScrollBehavior(), child: widget));
              },
              title: appName,
              theme: ThemeData(
                      shadowColor: primaryColor.withOpacity(0.25),
                      brightness: Brightness.light,
                      primaryColor: primaryColor,
                      scaffoldBackgroundColor: scaffoldBackgroundColor,
                      backgroundColor: backgroundColor,
                      canvasColor: blackColor,
                      hintColor: iconHintColor,
              ),
              darkTheme: ThemeData(
                      shadowColor: darkPrimaryColor.withOpacity(0.25),
                      brightness: Brightness.dark,
                      primaryColor: darkPrimaryColor,
                      scaffoldBackgroundColor: darkScaffoldBackgroundColor,
                      backgroundColor: darkBackgroundColor,
                      canvasColor: darkBlackColor,
                      hintColor: darkIconHint,
                      
              ),
              themeMode: themeNotifier.getThemeMode(),
              initialRoute: Routes.splash,
              onGenerateRoute: Routes.onGenerateRoute,
            )));
  }
}

但是当我尝试打开 main2.dart 时出现错误。 发生这种情况是因为您使用的BuildContext不包括您选择的提供者。 有几种常见的场景:

  • 您在main.dart中添加了一个新提供程序并执行了热重载。 要修复,请执行热重启。

  • 您尝试读取的提供程序位于不同的路径中。

    提供者是“范围的”。 因此,如果您在路由中插入提供程序,那么其他路由将无法访问该提供程序。

  • 您使用的BuildContext是您尝试读取的提供程序的祖先。

    确保 VideosYou 在您的 MultiProvider/Provider 下。 这通常发生在您创建提供程序并尝试立即读取它时。

main function 是应用程序的入口点。 推送新路由时,仅实例化MyApp2 ,不调用main

暂无
暂无

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

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