如何解决Flutter中'_Map<String,dynamic>'不是produk子类型等类型不匹配异常?
解决Flutter中JSON转自定义Model的类型不匹配错误
第一个错误:_Map<String, dynamic> is not a subtype of type produk
问题原因
直接将Dio返回的JSON Map数据添加到List<produk>列表中,未将Map转换为produk类的实例,类型不匹配导致报错。
解决方案
在produk类中实现fromJson工厂方法,将JSON Map映射为produk实例后再加入列表。
示例Model类(需确保字段与API返回结构匹配):
class Produk { final String id; final String nama; final double harga; Produk({required this.id, required this.nama, required this.harga}); // 核心转换方法 factory Produk.fromJson(Map<String, dynamic> json) { return Produk( id: json['id'] ?? '', nama: json['nama'] ?? '', harga: (json['harga'] ?? 0).toDouble(), ); } }
修正后的请求处理代码:
List<Produk> daftarProduk = []; void fetchProduk() async { try { Response response = await Dio().post('https://your-api-url.com/produk'); // 将Map转换为Produk实例后加入列表 Produk produkBaru = Produk.fromJson(response.data); daftarProduk.add(produkBaru); } catch (e) { print(e); } }
第二个错误:List<dynamic> is not a subtype of type List<produk>
问题原因
直接将API返回的List<dynamic>(内部为Map元素)赋值或添加到List<produk>中,未将列表中的每个Map元素转换为produk实例。
解决方案
遍历List<dynamic>中的每个元素,通过fromJson方法逐个转换为produk实例,再生成List<produk>。
修正后的请求处理代码:
List<Produk> daftarProduk = []; void fetchProdukList() async { try { Response response = await Dio().post('https://your-api-url.com/produks'); // 先获取原始动态列表,再逐个转换 List<dynamic> rawData = response.data; daftarProduk = rawData.map((item) => Produk.fromJson(item)).toList(); // 若需追加到已有列表,使用addAll: // daftarProduk.addAll(rawData.map((item) => Produk.fromJson(item)).toList()); } catch (e) { print(e); } }
额外注意事项
- 确保API返回的JSON结构与
fromJson方法中的字段映射一致,若API字段名与Model属性名不同,需手动对应(如API返回product_name,Model用nama,则写nama: json['product_name'] ?? '') - 若API返回嵌套结构(如
{ "data": [ ... ] }),需先提取数据再处理:List<dynamic> rawData = response.data['data']; - 添加空值判断,避免因API返回null导致转换失败
内容的提问来源于stack exchange,提问作者Vengenziy vengenziy
相关产品推荐
相关产品推荐

