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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:48:40