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

Flutter+Firebase项目谷歌退出后二次登录无响应问题

谷歌登出后再次登录无响应(按钮持续加载)问题解决

你的问题核心是混用了Firebase UI的SignInScreen组件和自定义的GoogleSignIn实例,导致登出后状态不一致,触发登录时无响应。以下是具体解决方案:

问题原因

Firebase UI的SignInScreen内部已经封装了谷歌登录的完整流程(包括实例管理、状态同步),而你手动创建了独立的GoogleSignIn实例并执行disconnect()/signOut(),这会破坏Firebase UI内部的登录状态关联,导致再次登录时组件无法正确触发认证流程。

解决方案

方案1:移除自定义GoogleSignIn实例,统一用FirebaseAuth登出

直接删除自定义的GoogleSignIn实例,仅保留FirebaseAuth的登出操作,让Firebase UI自行处理所有登录相关的状态同步:

修改后的代码:

import 'package:firebase_ui_auth/firebase_ui_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class AuthenticationScreen extends StatelessWidget {
  const AuthenticationScreen({super.key});

  Future<void> signout() async {
    await FirebaseAuth.instance.signOut();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return const SizedBox(
            height: 600,
            child: SignInScreen(),
          );
        } else {
          return ElevatedButton(
            onPressed: () {
              signout();
            },
            child: const Text("Sign out"),
          );
        }
      },
    );
  }
}

方案2:保留自定义操作,但禁用SignInScreen的缓存(移除const)

如果你需要保留自定义的GoogleSignIn操作,那么要确保登出后SignInScreen能重新初始化,避免缓存的旧状态影响。只需移除SignInScreen前的const关键字:

// 修改前
// return const SizedBox(
//   height: 600,
//   child: SignInScreen(),
// );

// 修改后
return SizedBox(
  height: 600,
  child: SignInScreen(),
);

这样当用户登出后,StreamBuilder重建时会创建新的SignInScreen实例,彻底重置内部状态,解决登录无响应的问题。

额外提示

热重载后恢复正常,是因为热重载会重建所有组件,重置了SignInScreen的缓存状态,这也验证了状态缓存是问题的诱因。

内容的提问来源于stack exchange,提问作者Johnny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:07:25