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

Dart封装JSON转List<T>工具遇不必要强制转换警告及运行报错问题

解决Flutter中JSON转List的强制转换警告问题

问题根源

原代码里BaseData的fromJson方法返回类型是BaseData,而非具体泛型类型T,导致map操作后生成的是Iterable<BaseData>,后续强转List<T>会触发不必要的强制转换警告;但直接移除强转又会因类型不匹配抛出运行时错误。

优化方案

1. 修改抽象基类BaseData为泛型类

把BaseData改成泛型抽象类,让fromJson返回具体的泛型类型,从根源解决类型不匹配问题:

abstract class BaseData<T> {
  T fromJson(Map<String, dynamic> json);
}

2. 调整实体类CommonOption的实现

让实体类继承泛型BaseData,并修正fromJson的返回类型:

class CommonOption extends BaseData<CommonOption> {
  String label;
  String value;

  CommonOption({required this.label, required this.value});

  factory CommonOption.fromJson(Map<String, dynamic> json) {
    return CommonOption(
      label: json['label'],
      value: json['value'],
    );
  }

  @override
  CommonOption fromJson(Map<String, dynamic> json) {
    return CommonOption.fromJson(json);
  }
}

3. 重构_fromJsonList方法

现在可以移除多余的强制转换,同时利用泛型约束确保类型安全:

List<T> _fromJsonList<T extends BaseData<T>>(dynamic data, T entity) {
  if (data != null && data is List) {
    return data.map((e) {
      if (e is Map<String, dynamic>) {
        // fromJson已返回T类型,无需强转
        return entity.fromJson(e);
      } else {
        // 保留原逻辑,非Map类型直接强转T
        return e as T;
      }
    }).toList(); // 直接返回List<T>,无需二次强转
  } else {
    return <T>[]; // 返回泛型空列表,避免类型警告
  }
}

4. 调用代码无需修改

原调用逻辑保持不变,编译器可正确推断类型:

Future<List<CommonOption>> getCategoryList() async {
  return await ApiService.instance.getList<CommonOption>(
      '/category/getCategoryList', CommonOption(label: "", value: ""));
}

额外优化建议

  • 可合并实体类的工厂方法和重写的fromJson方法,避免代码重复;
  • 如果不需要处理非Map类型的列表元素,可直接移除else分支简化逻辑。

内容的提问来源于stack exchange,提问作者月上老狗

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:28:10