如何将Map列表映射为自定义Address类对象列表?出现CastList类型报错
报错核心原因
你代码中cast()的泛型参数用错了层级:
- 执行完
toList()之后,当前返回的是元素类型为Address的列表 - 你调用
.cast<List<Address>>(),相当于告诉程序要把列表里的每一个元素都转成List<Address>类型,最终生成的CastList类型和你要赋值的List<Address>完全不匹配,因此触发类型不兼容的报错。
正确实现方案
方案1:移除多余的cast逻辑
绝大多数场景下,map逻辑里明确返回Address对象,直接调用toList()就会自动推导出List<Address>类型,不需要额外的类型转换:
List<Address> _userAddresses; _userAddresses = listOfMaps.map((address) { return Address( firstName: address["firstName"], lastName: address["lastName"], streetname: address["streetname"], houseNumber: address["houseNumber"], zipCode: address["zipCode"], city: address["city"], country: address["country"], state: address["state"], ); }).toList();
方案2:如果存在泛型推导障碍,修正cast的类型
如果因为listOfMaps是无类型的动态列表,导致编译器无法自动推导元素类型,需要做类型转换时,cast的对象类型应该是单个元素的类型Address,而不是整个列表的类型List<Address>:
_userAddresses = listOfMaps.map((address) { return Address( firstName: address["firstName"], lastName: address["lastName"], streetname: address["streetname"], houseNumber: address["houseNumber"], zipCode: address["zipCode"], city: address["city"], country: address["country"], state: address["state"], ); }).toList().cast<Address>();
额外优化建议
为了避免运行时取Map值出现动态类型解析异常,可以给map的入参、返回值显式标注泛型,从根源上避免类型错配:
_userAddresses = listOfMaps.map<Address>((Map<String, dynamic> address) { return Address( firstName: address["firstName"], lastName: address["lastName"], streetname: address["streetname"], houseNumber: address["houseNumber"], zipCode: address["zipCode"], city: address["city"], country: address["country"], state: address["state"], ); }).toList();
这种写法不需要额外调用cast(),类型推导最清晰,也不会出现层级错配的问题。
内容的提问来源于stack exchange,提问作者finnjgr
相关产品推荐
相关产品推荐

