Flutter Web谷歌登录后刷新/热重启currentUser为null问题求助
修复Flutter Web谷歌登录刷新后currentUser为null的问题
问题根源
Web端刷新后,Google Sign In的本地缓存会话仍存在(因此isSignedIn()返回true),但Firebase Auth不会自动同步该会话,导致auth.currentUser为null。必须手动将Google的登录凭证同步到Firebase Auth才能解决。
具体修复步骤
完善登录流程,关联Google凭证与Firebase Auth
获取GoogleSignInAccount后,必须获取其认证凭证,并调用Firebase Auth的signInWithCredential完成Firebase侧的登录,确保会话被Firebase记录。刷新后重新同步凭证
调用signInSilently获取缓存的用户会话后,再次执行凭证同步操作,触发Firebase Auth初始化当前用户。
修改后的代码示例
loginWithGoogle(context) async { try { if (kIsWeb) { googleSignIn = GoogleSignIn( clientId: 'client-id.apps.googleusercontent.com'); GoogleSignInAccount? googleSignInAccount = await googleSignIn.signInSilently(); if (googleSignInAccount == null) { googleSignInAccount = await googleSignIn.signIn(); } // 关键:获取Google认证凭证并同步到Firebase Auth if (googleSignInAccount != null) { final GoogleSignInAuthentication googleAuth = await googleSignInAccount.authentication; final OAuthCredential credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); // 完成Firebase登录,同步会话 await auth.signInWithCredential(credential); } googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) { // 更新本地登录状态 final User? currentUser = auth.currentUser; print(currentUser?.email); }); bool isSigned = await googleSignIn.isSignedIn(); if (isSigned) { final User? currentUser = auth.currentUser; print(currentUser?.email); } } else { // Android端处理逻辑 } } catch (e) { Get.snackbar('Firebase error', e.toString()); } }
额外优化建议
可以在应用初始化阶段提前检查并同步会话,避免刷新后需手动触发登录函数:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); if (kIsWeb) { final googleSignIn = GoogleSignIn(clientId: 'client-id.apps.googleusercontent.com'); final account = await googleSignIn.signInSilently(); if (account != null) { final googleAuth = await account.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); await FirebaseAuth.instance.signInWithCredential(credential); } } runApp(MyApp()); }
内容的提问来源于stack exchange,提问作者SulistyArif
相关产品推荐
相关产品推荐

