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环境用你的正式签名密钥指纹
- 确保包名与Flutter应用
- 在「API和服务」→「库」中搜索并启用Gmail API
- 若适配iOS,需检查iOS客户端ID的Bundle ID与Xcode配置一致
4. 清理缓存并重新测试
- 卸载设备上的测试应用
- 重新运行Flutter应用,测试登录与邮件发送流程
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

