如何将List<Map>转为List<ChartData>?转换后值全为0的问题
解决List
排查步骤及修复方案
1. 核对Map中的key是否完全匹配
先确认diData里每个Map对象的数值字段key是**'value'**(注意大小写、拼写必须完全一致)。如果实际key是'Value'、'val'这类变体,json['value']会返回null,非null安全环境下会被自动转为0,null安全环境下则直接报错。
修复:把fromJson里的key改成和原始Map一致的,比如实际key是'num'就修改为:
value: json['num'],
2. 显式处理数值类型转换
如果diData里的value是字符串类型(比如接口返回的JSON字符串),直接赋值给double会触发类型错误,若你做了错误捕获或使用旧版Dart,可能会被默认转为0。这时候需要显式转换:
factory ChartData.fromJson(Map<String, dynamic> json) => ChartData( time: DateTime.parse(json['time']), // 顺带修复字符串转DateTime的问题(若你的time是字符串格式) value: double.parse(json['value'].toString()), );
如果value是int类型(比如10、20),显式转为double更稳妥:
value: (json['value'] as num).toDouble(),
3. 验证原始数据是否正确
转换前先打印diData内容,确认里面的value字段确实不是0:
print(diData); // 查看每个Map里的value实际值
如果原始数据里的value本来就是0,那转换后自然也是0,这时候要检查数据来源是否正确。
4. 修复DateTime的潜在问题
顺带提一下,你的fromJson直接把json['time']赋值给DateTime类型,如果json['time']是字符串(比如"2024-05-20T12:00:00")会直接报错,需要改成:
time: DateTime.parse(json['time']),
如果json['time']是时间戳(比如1716187200000),则用:
time: DateTime.fromMillisecondsSinceEpoch(json['time']),
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

