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

Flutter调用GoogleAuthApi.signIn()后代码未执行,报sign_in_failed错误

问题分析与解决方案

为什么signIn()后后续代码不执行?

你调用api.signIn()时未添加异常捕获逻辑,当它抛出PlatformException后,异步函数会直接终止,导致后续代码完全无法执行。

如何解决ApiException: 10错误?

这个错误是Google Sign-In的典型配置问题,结合你发送Gmail邮件的业务需求,按以下步骤修复:

1. 补全异常捕获逻辑

将signIn()调用包裹进try-catch块,避免函数直接中断,同时处理各种异常场景:

Future sendNewUserEmail() async {
  final api = GoogleAuthApi();
  GoogleSignInAccount? googleUser;
  
  try {
    googleUser = await api.signIn();
    if (googleUser == null) {
      // 用户主动取消登录
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
        content: CustomSnackBar(
          snackColor: Colors.orange,
          snackMessage: '登录已取消'
        )
      ));
      return;
    }

    // 获取有效的OAuth2访问令牌
    final auth = await googleUser.authentication;
    final accessToken = auth.accessToken;
    if (accessToken == null) {
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
        content: CustomSnackBar(
          snackColor: Colors.red,
          snackMessage: '无法获取访问令牌'
        )
      ));
      return;
    }

    // 配置SMTP服务器并发送邮件
    final smtpServer = gmailSaslXoauth2('myemail@gmail.com', accessToken);
    final message = Message()
      ..from = const Address("myemail@gmail.com", "Deal Diligence")
      ..recipients = ['myemail@gmail.com']
      ..subject = "Welcome to Deal Diligence"
      ..text = "Welcome to Deal Diligence. Your password is NewPassord";

    await send(message, smtpServer);
    ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
      content: CustomSnackBar(
        snackColor: Colors.green,
        snackMessage: '邮件发送成功'
      )
    ));
  } on PlatformException catch (e) {
    print('登录失败: $e');
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(
      content: CustomSnackBar(
        snackColor: Colors.red,
        snackMessage: '登录失败: ${e.message}'
      )
    ));
  } on MailerException catch (e) {
    print('邮件发送失败: $e');
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(
      content: CustomSnackBar(
        snackColor: Colors.red,
        snackMessage: '邮件发送失败: $e'
      )
    ));
  } catch (e) {
    print('未知错误: $e');
    ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
      content: CustomSnackBar(
        snackColor: Colors.red,
        snackMessage: '未知错误'
      )
    ));
  }
}

2. 配置GoogleSignIn的权限范围

修改GoogleAuthApi,添加发送Gmail所需的OAuth2权限,否则无法获取有效的邮件发送令牌,同时修复isSignedIn的异步判断错误:

class GoogleAuthApi {
  final _googleSignIn = GoogleSignIn(
    scopes: [
      'email',
      'https://www.googleapis.com/auth/gmail.send', // 发送Gmail的核心权限
    ],
  );

  Future<GoogleSignInAccount?> signIn() async {
    final isSignedIn = await _googleSignIn.isSignedIn(); // 注意:isSignedIn是异步方法,需用await调用
    if (isSignedIn) {
      return _googleSignIn.currentUser;
    } else {
      return await _googleSignIn.signIn();
    }
  }
}

3. 修复Google Cloud Console配置

这是解决ApiException:10的核心:

  • 打开Google Cloud Console,进入你的项目
  • 进入「API和服务」→「凭据」,检查Android客户端ID:
    • 确保包名与Flutter应用android/app/build.gradle中的applicationId完全一致
    • 确保SHA-1指纹正确:debug环境用keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android获取,release环境用你的正式签名密钥指纹
  • 在「API和服务」→「库」中搜索并启用Gmail API
  • 若适配iOS,需检查iOS客户端ID的Bundle ID与Xcode配置一致

4. 清理缓存并重新测试

  • 卸载设备上的测试应用
  • 重新运行Flutter应用,测试登录与邮件发送流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:23:22