Flutter中google_sign_in始终加载历史登录账户问题求助
Firebase谷歌登录始终加载旧用户的问题修复
问题根源
- 登出方法未清除本地会话:你使用的
googleSignIn.disconnect()仅移除应用对谷歌账户的访问权限,但不会清除本地保存的用户登录会话,导致下次登录直接复用旧账户信息。 - 本地用户变量未重置:登出后
_user变量依然保留旧用户数据,UI无法感知状态变化。 - 登录流程未同步Firebase状态:直接使用GoogleSignIn的用户信息,未与FirebaseAuth的当前用户做同步,可能导致状态不一致。
修复方案
1. 修改登出方法
将disconnect()替换为signOut()清除本地会话,并重置_user变量、通知UI更新:
Future logOut() async { await FirebaseAuth.instance.signOut(); await googleSignIn.signOut(); // 清除本地会话,下次登录会弹出完整账户选择界面 _user = null; // 重置本地用户状态 notifyListeners(); // 通知UI刷新 }
2. 优化登录流程,同步Firebase状态
登录完成后从FirebaseAuth同步用户信息,确保本地状态与认证状态一致:
Future googleLogin() async { try { final googleUser = await googleSignIn.signIn(); if (googleUser == null) return; final googleAuth = await googleUser.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); // 完成Firebase认证后,同步当前登录用户 await FirebaseAuth.instance.signInWithCredential(credential); _user = googleSignIn.currentUser; } on Exception catch (e) { print(e.toString()); } notifyListeners(); }
3. 初始化时监听认证状态(可选)
在类的构造函数中添加FirebaseAuth状态监听,确保_user始终与当前认证状态同步:
GoogleLog() { FirebaseAuth.instance.authStateChanges().listen((firebaseUser) { if (firebaseUser == null) { _user = null; } else { _user = googleSignIn.currentUser; } notifyListeners(); }); }
完整修改后的代码
import 'package:flutter/material.dart'; import "package:google_sign_in/google_sign_in.dart"; import "package:firebase_auth/firebase_auth.dart"; import "package:goouser/global.dart" as global; import 'package:cloud_firestore/cloud_firestore.dart'; class GoogleLog extends ChangeNotifier { final googleSignIn = GoogleSignIn(); GoogleSignInAccount? _user; GoogleSignInAccount? get user => _user; // 改为可空类型,避免空指针异常 GoogleLog() { // 监听Firebase认证状态变化 FirebaseAuth.instance.authStateChanges().listen((firebaseUser) { if (firebaseUser == null) { _user = null; } else { _user = googleSignIn.currentUser; } notifyListeners(); }); } Future googleLogin() async { try { final googleUser = await googleSignIn.signIn(); if (googleUser == null) return; final googleAuth = await googleUser.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); await FirebaseAuth.instance.signInWithCredential(credential); // 同步当前登录用户信息 _user = googleSignIn.currentUser; } on Exception catch (e) { print(e.toString()); } notifyListeners(); } Future logOut() async { await FirebaseAuth.instance.signOut(); await googleSignIn.signOut(); _user = null; notifyListeners(); } }
额外注意事项
- 测试时彻底关闭应用再重新打开,避免缓存影响。
- 检查Firebase控制台中,应用的OAuth客户端ID配置正确,Android和iOS的SHA-1指纹已添加。
内容的提问来源于stack exchange,提问作者Lumi0Kr0mus
相关产品推荐
相关产品推荐

