Flutter中Google SignIn返回时await挂起问题求助
我之前在使用旧版google_sign_in插件时也碰到过一模一样的问题!你用的google_sign_in: ^3.0.0和firebase_auth: ^0.5.0都是比较老的版本,这个版本的插件存在一个明确的bug:当用户在账号选择界面按下返回键取消登录时,signIn()返回的Future既不会抛出异常,也不会正常完成,直接导致你的await一直挂起,后面的代码和catch块根本没机会执行。
给你几个可行的解决办法:
优先升级插件版本
这个bug在后续的插件版本里已经被官方修复了,新版的google_sign_in会在用户取消登录时抛出SignInCanceledException,你就能正常在catch块里捕获并处理取消事件了。建议把插件升级到稳定的新版本,比如google_sign_in至少升到^4.0.0以上,同时注意firebase_auth的版本要和Flutter SDK以及google_sign_in版本兼容(可以参考插件pub页的版本适配说明)。升级后你的原有代码应该就能正常捕获取消操作了。临时方案:给Future加超时处理
如果暂时没办法升级插件,可以给signIn()加上超时限制,用Future.timeout()来强制结束挂起的Future,这样就能在catch块里处理取消/超时的情况了,示例代码如下:try { print('google signin...'); final GoogleSignInAccount account = await GoogleSignIn().signIn().timeout( const Duration(seconds: 30), // 设置合理的超时时间 onTimeout: () => throw TimeoutException('登录操作超时或被取消'), ); // 登录成功后的逻辑 print('登录成功,账号:${account.displayName}'); } on TimeoutException catch (e) { print('用户取消登录或登录超时:$e'); // 这里处理取消登录的逻辑 } catch (e) { print('登录过程中出现错误:$e'); }额外提示:监听页面返回事件(可选)
你也可以在启动谷歌登录的页面监听返回键事件,当用户按下返回时手动取消登录请求,但这种方法需要维护Future的取消令牌,实现起来比较繁琐,不如前两种方法高效。
内容的提问来源于stack exchange,提问作者gbaccetta

