簡體   English   中英

Flutter MultiProvider 未找到

[英]Flutter MultiProvider Not found

錯誤:在此 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();
      } 
    }

確保在StreamProvider上指定泛型類型:

StreamProvider<User?>(
  ...
)

請注意,您已將null設置為 initialData,因此您的小部件可能需要處理null用戶。 意味着你需要做:

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

通過運行以下命令安裝提供程序:

flutter pub add provider ,然后在您的 main.dart 文件中,將其import 'package:provider/provider.dart';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM