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

Flutter API集成调用接口拉取数据仅返回null问题求助

问题排查&修复方案

核心问题1:Item类的fromMap构造函数写法完全错误

你当前的Item.fromMap是命名构造函数,但函数内部只是创建了一个临时的Item对象,没有把解析后的值赋值给当前实例的字段,导致所有解析出来的Item对象字段全是默认的null。

核心问题2:packagescors字段解析字段名错误

你判断map["packagescors"]不为空后,错误取了map["device_details"]字段解析,必然导致解析失败或者字段为空。

核心问题3:请求&解析逻辑没有加任何空校验和异常捕获

你直接硬取json.decode(response.body)['data']['items'],如果请求状态码非200、返回结构缺少data字段、缺少items字段,都会直接抛出异常,导致函数执行中断,返回空或者异常,看起来就像请求返回null。

其他优化点

initState中循环调用setState没有必要,拿到全部数据后赋值一次即可。


修复代码示例

1. 修复Item类的fromMap构造函数

// 改成factory构造函数写法,正确返回解析后的Item对象
factory Item.fromMap(Map<String, dynamic> map) => Item(
  sequenceno: map["sequenceno"],
  id: map["_id"],
  chapter: map["chapter"],
  title: map["title"],
  packageDescription: map["package_description"],
  // 加空判断避免age_level为空时报错
  ageLevel: map["age_level"] != null ? List<int>.from(map["age_level"].map((x) => x)) : null,
  pkgSequence: map["pkg_sequence"],
  // 修复字段名错误,把device_details改成packagescors
  packagescors: map["packagescors"] != null
      ? List<Packagescors>.from(
          map["packagescors"].map((x) => Packagescors.fromMap(x)))
      : [],
);

2. 修复http_mixin的请求逻辑,增加校验和异常捕获

Future<List<Item>> getmoduleList(String userId, String accountId) async {
  try {
    final queryParameters ={
      'subject':'Maths',
      'grade':'6'
    };  
    final response = await http.get(Uri.https(_baseUrl, "MY URI",queryParameters), headers: {
      'Content-Type': 'application/json',
      'user-id': userId,
      'account-id': accountId,
    });
    // 先判断请求状态码是否正常
    if (response.statusCode != 200) {
      print("请求失败,状态码:${response.statusCode},返回内容:${response.body}");
      return [];
    }
    final resJson = json.decode(response.body);
    // 逐层校验字段是否存在
    if (resJson['data'] == null || resJson['data']['items'] == null) {
      print("返回结构异常,返回内容:${response.body}");
      return [];
    }
    List <Item> jsonresponse = List<Item>.from(resJson['data']['items'].map((e)=>Item.fromMap(e)));
    print("解析成功,共${jsonresponse.length}条数据");
    return jsonresponse;
  } catch (e, stack) {
    print("请求或解析出错:$e\n$stack");
    return [];
  }
}

3. 优化initState的逻辑,减少不必要的setState调用

@override
void initState() {
  super.initState();
  _dbHelper.getAllUserData().then((value)async{
    userdetails = value;
    if (value.isEmpty) return;
    var response = await getmoduleList(value[0].userId.toString(),value[0].accountId.toString());
    // 一次性赋值,只调用一次setState
    setState(() {
      modules = response;
    });
    // 测试打印
    if (modules.isNotEmpty) {
      print('Test Printing ${modules[0].pkgSequence}');
      print('Test Printing ${modules[0].id}');
    }
  });
}

修复完成后运行项目,查看控制台打印的日志,就能定位到具体是请求失败、返回结构异常还是解析错误的问题,按日志提示调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:27:04