Flutter中DrawerNavigation找不到正确Provider<AuthBlock>如何解决?
你遇到的报错核心原因是:你在DrawerNavigation组件中通过Provider.of<AuthBlock>(context)获取AuthBlock实例时,Flutter在当前组件的上层Widget树中,找不到你提前注册的Provider<AuthBlock>实例。Provider要求你必须在需要访问实例的组件的上层节点,提前完成实例的注册挂载,否则无法向下传递。
步骤1:修改根App组件完成AuthBlock注册
打开你项目中的lib/src/app.dart文件,将根组件用Provider包裹,注册AuthBlock实例,参考代码如下:
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:to_do_list/blocks/auth_block.dart'; import 'package:to_do_list/screens/home_screen.dart'; class App extends StatelessWidget { @override Widget build(BuildContext context) { // 如果你不需要监听AuthBlock的状态变化,直接使用Provider即可 return Provider<AuthBlock>( create: (context) => AuthBlock(), child: MaterialApp( title: '待办清单', theme: ThemeData(primarySwatch: Colors.blue), home: HomeScreen(), ), ); // 如果你后续需要监听登录状态变化,就把上面的Provider换成ChangeNotifierProvider,同时给AuthBlock加ChangeNotifier混入 /* return ChangeNotifierProvider( create: (context) => AuthBlock(), child: MaterialApp( title: '待办清单', theme: ThemeData(primarySwatch: Colors.blue), home: HomeScreen(), ), ); */ } }
步骤2:(可选)适配状态监听需求
如果你后续需要根据登录状态动态更新UI,给AuthBlock加上ChangeNotifier混入,修改后的AuthBlock代码如下:
import 'package:flutter/foundation.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:to_do_list/service/auth_service.dart'; class AuthBlock with ChangeNotifier { final authService = AuthService(); final googleSignIn = GoogleSignIn(scopes: ['email']); Stream<User> get currentUser => authService.currentUser; loginWithGoogle() async { try { final GoogleSignInAccount googleUser = await googleSignIn.signIn(); final GoogleSignInAuthentication googleAuth = await googleUser.authentication; final AuthCredential credential = GoogleAuthProvider.credential( idToken: googleAuth.idToken, accessToken: googleAuth.accessToken, ); final result = await authService.signInWithCredential(credential); print('登录用户:${result.user.displayName}'); // 通知所有监听者状态更新 notifyListeners(); } catch (error) { print('登录报错:$error'); } } logout() { authService.logout(); notifyListeners(); } }
步骤3:全量重启应用
修改完成后,停止当前运行的应用,重新启动,不要使用热重载,避免上下文未刷新导致报错仍然存在。
内容的提问来源于stack exchange,提问作者QuickAccount
相关产品推荐
相关产品推荐

