Flutter使用WooCommerce API映射商品图片列表报错及Dart类建模咨询
问题修复方案
你遇到的报错是Dart空安全特性移除了默认的List()构造函数导致的,同时现有代码还存在字段key写错、空值未兜底的问题,修复后的完整代码如下:
class ProductModel { // 建议根据接口返回情况调整为可空类型(如String? name),避免字段缺失时报错 late String name; late int id; late String status; late String price; late List<ImageModel> images; ProductModel( this.name, this.id, this.status, this.images, this.price, ); ProductModel.fromJson(Map<String, dynamic> json) { name = json['name'] ?? ''; id = json['id'] ?? 0; status = json['status'] ?? ''; price = json['price'] ?? ''; // 一行完成图片列表序列化,自动处理空值、类型转换 images = (json['images'] as List<dynamic>?) ?.map((v) => ImageModel.fromJson(v)) .toList() ?? []; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['name'] = name; data['id'] = id; data['status'] = status; data['images'] = images.map((v) => v.toJson()).toList(); data['price'] = price; return data; } } // 类名改用大驼峰,避免和Flutter自带Image组件重名 class ImageModel { late int id; late String src; late String title; ImageModel({ this.id = 0, this.src = "", this.title = "", }); ImageModel.fromJson(Map<String, dynamic> json) { id = json['id'] ?? 0; src = json['src'] ?? ''; title = json['title'] ?? ''; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['id'] = id; data['src'] = src; data['title'] = title; return data; } }
核心修改说明
- 删除了错误的
images = json['image'];赋值语句,避免类型不匹配报错 - 空安全下使用
[]初始化可增长列表,替代已禁用的List<Images>()构造函数 - 增加空值兜底逻辑,接口返回
images为null时自动赋值空数组,避免late字段未初始化报错 - 所有字段增加默认值,避免接口返回字段缺失时的运行时异常
JSON转Dart类最佳实践
- 优先使用官方推荐的
json_serializable自动生成序列化代码,避免手写出现拼写错误、类型转换问题,生成的代码天然适配空安全 - 明确字段可空性,不要滥用
late关键字,如果接口存在返回null的可能,直接声明为可空类型(如String? name) - 列表类型序列化优先使用
map转换的写法,代码更简洁,不需要手动循环添加元素 - 类名遵守Dart大驼峰规范,避免和系统自带类重名产生冲突
- 所有字段转换时增加默认值兜底,不要直接强制取值,避免接口字段变动导致应用崩溃
内容的提问来源于stack exchange,提问作者Abubakar
相关产品推荐
相关产品推荐

