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

调用Curriculum API获取数据时遇TypeError:Null无法转为Map<String,dynamic>求助

调用Curriculum API时遇到_TypeError:Null不是Map<String, dynamic>的子类型

问题详情

调用Curriculum API获取数据时触发异常:_TypeError(类型'Null'不是类型'Map<String, dynamic>'的子类型),调用代码如下:

static Future<Kurikulum> getDetailHeader(String id) async {
    String url = Constant.baseURL;
    String token = await UtilSharedPreferences.getToken();
    final response = await http.get(
      Uri.parse(
        '$url/auth/mhs_siakad/kurikulum/detail/$id',
      ),
      headers: {
        'Authorization': 'Bearer $token',
      },
    );
    print(response.statusCode);
    print(response.body);
    if (response.statusCode == 201) {
      final result = json.decode(response.body) as Map<String, dynamic>;
      Data detailKurikulum = Data.fromJson(result['data']['kurikulum']);
      Kurikulum l = detailKurikulum.mk as Kurikulum;
      return l;
    } else {
      throw Exception();
    }
  }

问题原因

  1. 直接访问嵌套字段result['data']['kurikulum'],未做null校验,若接口返回的data或kurikulum字段为null、缺失,会触发类型转换错误。
  2. 仅判断状态码为201,忽略了接口可能返回的其他成功状态码(如200),导致合法响应被误判为失败。
  3. 异常处理过于笼统,无法定位具体错误原因。

修复方案

增加null安全校验,扩大成功状态码范围,优化异常信息:

static Future<Kurikulum> getDetailHeader(String id) async {
  String url = Constant.baseURL;
  String token = await UtilSharedPreferences.getToken();
  final response = await http.get(
    Uri.parse('$url/auth/mhs_siakad/kurikulum/detail/$id'),
    headers: {'Authorization': 'Bearer $token'},
  );

  print(response.statusCode);
  print(response.body);

  // 校验所有成功状态码(200-299)
  if (response.statusCode >= 200 && response.statusCode < 300) {
    final result = json.decode(response.body) as Map<String, dynamic>;
    
    // 逐层校验字段,避免null直接传入fromJson
    final data = result['data'] as Map<String, dynamic>?;
    final kurikulumRawData = data?['kurikulum'] as Map<String, dynamic>?;
    
    if (kurikulumRawData == null) {
      throw Exception('接口返回的kurikulum数据为空或格式不符');
    }
    
    Data detailKurikulum = Data.fromJson(kurikulumRawData);
    Kurikulum l = detailKurikulum.mk as Kurikulum;
    return l;
  } else {
    throw Exception('请求失败,状态码:${response.statusCode}');
  }
}

额外建议

  • 查看打印的response.body,确认接口实际返回的JSON结构是否符合预期,重点检查data.kurikulum字段是否存在且为Map类型。
  • 确保Data和Kurikulum模型类支持null安全,内部解析逻辑添加空值处理。
  • 推荐使用json_serializable库自动生成模型类,减少手动解析的错误概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:13:27