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

Flutter存取List<DilemmData>时触发_CastError:类型转换不匹配

解决Flutter中SharedPreferences加载DilemmData列表的类型转换异常

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:33:17