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

解决Hive存储API响应时List<dynamic>与Map<String,dynamic>类型不匹配错误

解决List is not a subtype of type Map<String, dynamic>错误

问题出在这三个地方

  1. getListUnit方法的返回类型写错了——API返回的是包含状态、消息和单元列表的UnitModel结构,不是单个UnitListDataModel
  2. 调用_addItem时,直接传了res.data['data'](类型是List<dynamic>),但方法要求的是List<Map<String, dynamic>>,没做类型转换
  3. 最后返回UnitListDataModel.fromJson(res.data)完全不对——res.data是整个响应的JSON(带status、msg、data字段),根本不是单个单元数据的JSON

修正后的meter_service.dart代码

class MeterServices {
  final _api = DioHelper().getDio();
  final _prefs = Prefs();

  Future<void> _addItem(List<Map<String, dynamic>> newItems) async {
    for (var newItem in newItems) {
      await _prefs.item.add(newItem);
    }
  }

  // 把返回类型改成UnitModel,匹配API响应结构
  Future<UnitModel> getListUnit({String? kode}) async {
    final res = await _api.post('/unit/get');
    
    // 先把API响应转成UnitModel,确保数据结构正确
    final unitModel = UnitModel.fromJson(res.data);
    
    if (_prefs.item.isEmpty) {
      // 将单元列表转成符合要求的Map列表,再传入_addItem
      final itemMaps = unitModel.data.map((item) => item.toJson()).toList();
      await _addItem(itemMaps);
    }

    // 返回正确的UnitModel对象
    return unitModel;
  }
}

额外提醒

  • 确认你的Hive Box(_prefs.item)确实是用来存Map<String, dynamic>的,如果想直接存UnitListDataModel对象,得给这个类生成Hive适配器
  • 如果API返回的res.data['data']本身就是合法的List<Map>,也可以直接转类型:await _addItem(res.data['data'].cast<Map<String, dynamic>>());,不过用模型类的toJson()转换更稳妥,能保证数据结构和定义一致

内容的提问来源于stack exchange,提问作者Fandy Ahmad Irianto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:00:36