升级google_sign_in至6.0.0后Google登录功能异常求助
解决google_sign_in ^6.0.0登录后调用People API失败的问题
问题根源
- 重复登录触发冲突:
signIn方法里同时调用signInSilently()和await _googleSignIn.signIn(),两次登录流程会导致状态混乱。 - authHeaders在web端的兼容性变化:6.x版本中web端的
user.authHeaders获取逻辑有变更,直接使用会触发请求错误。
解决方案
1. 修复重复登录逻辑
把signInSilently()移到页面初始化阶段执行,避免和主动登录流程冲突:
@override void initState() { super.initState(); // 页面初始化时尝试静默登录 signInSilently(); } void signInSilently() { _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) { print('signInsilently log!!'); print(account); if (account != null) { _handleGetContact(account); } }); _googleSignIn.signInSilently(); } Future<void> signIn() async { try { var googleSignInAccount = await _googleSignIn.signIn(); print(googleSignInAccount); if (googleSignInAccount != null) { await _handleGetContact(googleSignInAccount); } } catch (e) { print('登录出错: $e'); } }
2. 调整People API请求的header构建方式
不再依赖user.authHeaders,改为通过user.authentication获取accessToken后手动构建请求头:
Future<void> _handleGetContact(GoogleSignInAccount user) async { try { final GoogleSignInAuthentication auth = await user.authentication; final String accessToken = auth.accessToken!; final http.Response response = await http.get( Uri.parse('https://people.googleapis.com/v1/people/me/connections' '?requestMask.includeField=person.names'), headers: { 'Authorization': 'Bearer $accessToken', }, ); if (response.statusCode != 200) { print('People API ${response.statusCode} response: ${response.body}'); return; } final Map<String, dynamic> data = json.decode(response.body) as Map<String, dynamic>; // 此处处理返回的联系人数据 } catch (e) { print('获取联系人出错: $e'); } }
3. 额外检查
确保web项目的index.html中已正确引入Google GSI脚本:
<script src="https://accounts.google.com/gsi/client" async defer></script>
内容的提问来源于stack exchange,提问作者K m.k
相关产品推荐
相关产品推荐

