解决Hive存储API响应时List<dynamic>与Map<String,dynamic>类型不匹配错误
解决List is not a subtype of type Map<String, dynamic>错误
问题出在这三个地方
getListUnit方法的返回类型写错了——API返回的是包含状态、消息和单元列表的UnitModel结构,不是单个UnitListDataModel- 调用
_addItem时,直接传了res.data['data'](类型是List<dynamic>),但方法要求的是List<Map<String, dynamic>>,没做类型转换 - 最后返回
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
相关产品推荐
相关产品推荐

