Flutter应用从Microsoft AAD获取登录用户Object ID报错求助
解决Flutter调用Microsoft Graph API获取用户ID时的NoSuchMethodError问题
我一眼就揪出问题的核心了——你在createUser方法里的请求成功判断逻辑错了!
Microsoft Graph API的GET请求(比如/me接口)成功返回的状态码是200 OK,但你代码里写的是response.statusCode == 201,201是POST创建资源成功的状态码,这就导致哪怕请求正常返回用户数据,你的代码也会走进else分支返回null,后续调用info.id自然就抛出了The getter 'id' was called on null的错误。
第一步:修复状态码判断
把createUser里的状态码判断改成200,同时建议加上错误日志方便调试:
Future<InfoMe> createUser(String accessToken) async{ final String apiUrl = 'https://graph.microsoft.com/v1.0/me'; final response = await http.get(apiUrl,headers: { "Authorization": "Bearer $accessToken", "Content-Type": "application/json" }); // 将201改为200,符合GET请求成功的状态码规范 if (response.statusCode == 200) { final String responseString = response.body; print('$responseString'); return infoMeFromJson(responseString); } else { // 打印错误信息,方便排查token或权限问题 print('请求失败,状态码:${response.statusCode},响应内容:${response.body}'); return null; } }
第二步:添加空值安全检查
哪怕修复了状态码,也可能因为token无效、权限不足等原因返回null,所以在login方法里必须先判断info是否为空,避免直接调用null的属性:
void login() async { try { await oauth.login(); // 原代码里的oauth.getIdToken().toString();没有实际用途,可以删掉或按需保存 var accessToken = await oauth.getAccessToken(); final InfoMe info = await createUser(accessToken); // 先判断info不为空再操作 if(info != null){ setState(() { information = info; }); showMessage("${information.displayName} ${information.id}"); } else { showError("获取用户信息失败,请检查token或应用权限"); } } catch (e) { showError(e); } }
额外调试小贴士
- 可以临时在
createUser里打印accessToken(注意生产环境别这么做,避免泄露敏感信息),确认token是否有效 - 检查你的AAD应用是否配置了
User.Read权限,这是调用/me接口的必需权限
内容的提问来源于stack exchange,提问作者Surekha Sharad Muzumdar
相关产品推荐
相关产品推荐

