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

Flutter中google_sign_in始终加载历史登录账户问题求助

Firebase谷歌登录始终加载旧用户的问题修复

问题根源

  1. 登出方法未清除本地会话:你使用的googleSignIn.disconnect()仅移除应用对谷歌账户的访问权限,但不会清除本地保存的用户登录会话,导致下次登录直接复用旧账户信息。
  2. 本地用户变量未重置:登出后_user变量依然保留旧用户数据,UI无法感知状态变化。
  3. 登录流程未同步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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:05:19