Flutter集成Firebase Google登录跳过账号选择流程直接登录问题
问题根因
你遇到的跳过账号选择弹窗的问题核心是两个配置疏漏:
- 你的
signInWithGoogle方法每次调用都会新建GoogleSignIn实例,默认会复用系统Google服务中已存储的当前应用授权会话,只要存在历史授权记录就会直接返回已登录账号,不会触发账号选择流程 - 现有登出逻辑仅清除了Firebase Auth的登录状态,没有同步清理Google SignIn的本地缓存与授权信息,进一步导致下次登录直接复用历史账号
修复步骤
1. 全局统一管理GoogleSignIn实例
在general_providers.dart中新增GoogleSignIn的全局Provider,避免每次调用时重复新建实例:
import 'package:google_sign_in/google_sign_in.dart'; // 原有代码保留,新增以下内容 final googleSignInProvider = Provider<GoogleSignIn>((ref) => GoogleSignIn());
2. 修改signInWithGoogle方法,登录前强制清除历史授权
修改firebase_auth_service.dart中的signInWithGoogle方法,调用登录接口前先清理历史会话,强制触发账号选择流程:
Future<UserCredential> signInWithGoogle() async { try { final googleSignIn = _read(googleSignInProvider); // 新增以下两行,清除历史授权缓存 await googleSignIn.signOut(); await googleSignIn.disconnect(); final GoogleSignInAccount? googleUser = await googleSignIn.signIn(); final GoogleSignInAuthentication? googleAuth = await googleUser?.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth?.accessToken, idToken: googleAuth?.idToken, ); return await _read(firebaseAuthProvider).signInWithCredential(credential); } catch (error) { throw FirebaseAuthException(code: error.toString()); } }
3. 完善登出逻辑,同步清理Google授权信息
修改firebase_auth_service.dart中的signOut方法,登出时同步清理Google SignIn的缓存:
Future<void> signOut() async { await _read(firebaseAuthProvider).signOut(); // 新增以下两行,同步清理Google授权 await _read(googleSignInProvider).signOut(); await _read(googleSignInProvider).disconnect(); }
可选验证操作
如果修改后仍存在问题,可以到测试设备的「系统设置 > 账号 > Google > 已连接的应用」中找到你的应用,删除现有授权后再测试。
内容的提问来源于stack exchange,提问作者Nick Christensen
相关产品推荐
相关产品推荐

