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
相关产品推荐
相关产品推荐

