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,提问作者月上老狗
相关产品推荐
相关产品推荐

