Flutter从JSON加载DilemmData时plus/minus列表为空求解决
问题原因及修复方案
核心问题
你的plus和minus列表始终为空,根源在于两个关键错误:
- final列表未正确初始化:
DilemmData的plus/minus是final类型,原构造函数仅声明参数但未将传入元素赋值给这两个列表; - 子对象未完成JSON转换:从JSON读取的
plus/minus是原始Map数组,没有转换成DilemmItemData对象,直接传入构造函数无法被识别。
修复步骤
1. 修正DilemmData构造函数
针对final列表的特性,通过初始化列表完成赋值,替换原构造函数:
class DilemmData { double percent; final String title; final String date; final List<DilemmItemData> plus; final List<DilemmItemData> minus; // 修正后的构造函数:通过初始化列表为final列表赋值 DilemmData({ List<DilemmItemData>? plus, List<DilemmItemData>? minus, this.percent = 0, this.title = '', this.date = '', }) : plus = plus ?? [], minus = minus ?? []; // 其余toJson、encode、decode方法保持不变 }
2. 修正fromJson的列表解析逻辑
在fromJson中,需要将JSON数组中的每个元素转换成DilemmItemData对象,再传入构造函数:
factory DilemmData.fromJson(Map<String, dynamic> json) { print('BOBA: ${json['plus']}'); // 解析plus列表:将每个Map转为DilemmItemData实例 final plusList = (json['plus'] as List<dynamic>) .map((item) => DilemmItemData.fromJson(item as Map<String, dynamic>)) .toList(); // 解析minus列表:同理处理 final minusList = (json['minus'] as List<dynamic>) .map((item) => DilemmItemData.fromJson(item as Map<String, dynamic>)) .toList(); return DilemmData( plus: plusList, minus: minusList, percent: json['percent'], title: json['title'], date: json['date'], ); }
3. 可选:增强空值容错
如果JSON中可能缺失plus/minus字段,添加空值判断避免运行时错误:
final plusList = json['plus'] != null ? (json['plus'] as List<dynamic>) .map((item) => DilemmItemData.fromJson(item as Map<String, dynamic>)) .toList() : [];
验证修复
完成上述修改后,重新从SharedPreferences加载数据,plus和minus列表即可正确解析并填充对应数据。
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

