【问题标题】:Flutter MultiProvider Not foundFlutter MultiProvider 未找到
【发布时间】:2022-01-25 01:33:38
【问题描述】:

错误:在此 AuthenticationWrapper 小部件上方找不到正确的提供程序

发生这种情况是因为您使用了不包含提供程序的 BuildContext 你的选择。有几种常见的情况:

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

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

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

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

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

    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:firebase_core/firebase_core.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:google_fonts/google_fonts.dart';
    import 'package:park_app/app_styles.dart';
    import 'package:provider/provider.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    import './views/pages.dart';
    import 'views/authentication/authentication_service.dart';
    import 'Home_Page.dart';
    
    bool? seenOnboard;
    
    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();

      // to show status bar
      SystemChrome.setEnabledSystemUIOverlays(
          [SystemUiOverlay.bottom, SystemUiOverlay.top]);
      // to load onboard for the first time only
      SharedPreferences pref = await SharedPreferences.getInstance();
      seenOnboard = pref.getBool('seenOnboard') ?? false; //if null set to false
    
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            Provider<AuthenticationService>(
              create: (_) => AuthenticationService(FirebaseAuth.instance),
            ),
            StreamProvider(
                initialData: null,
                create: (context) =>
                    context.read<AuthenticationService>().authStateChanges),
          ],
          child: MaterialApp(
            debugShowCheckedModeBanner: false,
            title: 'Park App',
            theme: ThemeData(
              textTheme: GoogleFonts.manropeTextTheme(
                Theme.of(context).textTheme,
              ),
              primarySwatch: Colors.blue,
              scaffoldBackgroundColor: kScaffoldBackground,
            ),
            home: seenOnboard == true ? AuthenticationWrapper() : OnBoardingPage(),
          ),
        );
      }
    }
    
    class AuthenticationWrapper extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final firebaseUser = context.watch<User>();
    
        if (firebaseUser != null) {
          return HomePage();
        }
        return LoginPage();
      } 
    }

【问题讨论】:

    标签: flutter


    【解决方案1】:

    确保在StreamProvider上指定泛型类型:

    StreamProvider<User?>(
      ...
    )
    

    请注意,您已将null 设置为initialData,因此您的小部件可能需要处理null 用户。意思是你需要做的:

    final user = context.watch<User?>()
    

    【讨论】:

    • 成功了!!!!!
    猜你喜欢
    • 2020-09-21
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多