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

Flutter中Google SignIn返回时await挂起问题求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:37:58