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

Flutter从JSON加载DilemmData时plus/minus列表为空求解决

问题原因及修复方案

核心问题

你的plus和minus列表始终为空,根源在于两个关键错误:

  1. final列表未正确初始化:DilemmData的plus/minus是final类型,原构造函数仅声明参数但未将传入元素赋值给这两个列表;
  2. 子对象未完成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:27:16