You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web谷歌登录后刷新/热重启currentUser为null问题求助

修复Flutter Web谷歌登录刷新后currentUser为null的问题

问题根源

Web端刷新后,Google Sign In的本地缓存会话仍存在(因此isSignedIn()返回true),但Firebase Auth不会自动同步该会话,导致auth.currentUser为null。必须手动将Google的登录凭证同步到Firebase Auth才能解决。

具体修复步骤

  1. 完善登录流程,关联Google凭证与Firebase Auth
    获取GoogleSignInAccount后,必须获取其认证凭证,并调用Firebase Auth的signInWithCredential完成Firebase侧的登录,确保会话被Firebase记录。

  2. 刷新后重新同步凭证
    调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:12:37