Flutter存取List<DilemmData>时触发_CastError:类型转换不匹配
调用loadDillems()加载数据时抛出_CastError,提示_InternalLinkedHashMap<String, dynamic>无法转换为List,问题根源在于DilemmData.fromJson构造函数的参数处理逻辑错误。
错误原因分析
DilemmData构造函数的plus、minus参数未指定类型,且直接将JSON解析出的List<Map<String, dynamic>>传入,没有转换为List<DilemmItemData>类型- 当
fromJson调用DilemmData(json['plus'], json['minus'])时,json['plus']是原始的Map列表,构造函数无法自动完成类型转换,导致类型不匹配抛出异常
修复方案
1. 明确构造函数参数类型
给DilemmData的plus、minus参数加上List<DilemmItemData>类型约束,避免隐式类型错误。
2. 手动转换子列表数据
在fromJson中,遍历json['plus']和json['minus']的每个元素,通过DilemmItemData.fromJson转换为对应实例。
修改后的完整DilemmData类代码:
class DilemmData { double percent = 0; final String title; final String date; final List<DilemmItemData> plus; final List<DilemmItemData> minus; // 明确参数类型 DilemmData( this.plus, this.minus, { this.percent = 0, this.title = '', this.date = '', }); static Map<String, dynamic> toJson(DilemmData dilemm) { return { 'percent': dilemm.percent, 'title': dilemm.title, 'date': dilemm.date, 'plus': dilemm.plus.map((e) => e.toJson()).toList(), 'minus': dilemm.minus.map((e) => e.toJson()).toList(), }; } factory DilemmData.fromJson(Map<String, dynamic> json) { // 转换plus列表的每个元素为DilemmItemData final plusList = (json['plus'] as List<dynamic>) .map((item) => DilemmItemData.fromJson(item as Map<String, dynamic>)) .toList(); // 转换minus列表的每个元素为DilemmItemData final minusList = (json['minus'] as List<dynamic>) .map((item) => DilemmItemData.fromJson(item as Map<String, dynamic>)) .toList(); return DilemmData( plusList, minusList, percent: json['percent'], title: json['title'], date: json['date'], ); } static String encode(List<DilemmData> pressure) => json.encode( pressure .map<Map<String, dynamic>>((dil) => DilemmData.toJson(dil)) .toList(), ); static List<DilemmData> decode(String dilemm) => ((json.decode(dilemm) ?? []) as List<dynamic>) .map<DilemmData>((dil) => DilemmData.fromJson(dil as Map<String, dynamic>)) .toList(); }
可选优化
为避免位置参数带来的混淆,可将plus、minus改为命名参数:
// 修改构造函数 DilemmData({ required this.plus, required this.minus, this.percent = 0, this.title = '', this.date = '', }); // fromJson中对应调用 return DilemmData( plus: plusList, minus: minusList, percent: json['percent'], title: json['title'], date: json['date'], );
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

