Flutter中API返回List转List<Map<String,dynamic/String>>实现方案
报错根因
三个报错本质都是Dart强类型系统下的泛型嵌套转换问题:
jsonDecode反序列化JSON后的默认返回类型是dynamic,解析出的数组实际为List<dynamic>,数组内的对象是_InternalLinkedHashMap<String, dynamic>,直接对整个集合做一次性强制类型转换不会触发深层类型匹配,必然触发类型错误List<Map<String, dynamic>>和List<Map<String, String>>是完全不兼容的类型,二者Map的value类型分别为dynamic和String,不存在子类型继承关系,无法直接赋值- 接口返回的
id字段是int类型,直接把整个Map强转为Map<String, String>时,int类型的value无法匹配String类型要求,就会抛出类型转换异常
正确转换代码
import 'dart:convert' as convert; if (response.statusCode == 200) { // 逐层解析拿到content数组 final decodeRes = convert.jsonDecode(reply) as Map<String, dynamic>; final contentList = decodeRes['data']['content'] as List<dynamic>; // 逐元素转换为目标类型 List<Map<String, String>> values = contentList.map((element) { final rawMap = element as Map<String, dynamic>; // 遍历所有键值对,将value统一转为String,生成符合类型要求的Map return rawMap.map((k, v) => MapEntry(k, v.toString())); }).toList(); // 此处得到的values即可直接传入smart_select组件使用 }
优化建议
如果smart_select组件不需要用到接口返回的全量字段,可以不用转换所有键值对,只提取业务需要的字段即可,性能更好逻辑也更清晰,示例:
List<Map<String, String>> selectOptions = contentList.map((element) { final item = element as Map<String, dynamic>; return { // 按你使用的smart_select版本要求调整字段名即可,常规选择组件只需要value和展示标题 'value': item['id'].toString(), 'title': item['name'] as String, 'make': item['make'] as String, // 需要分组、额外属性时再加对应字段 }; }).toList();
注意:不要用
as关键字做跨不兼容类型的强转,对于实际类型和目标类型不匹配的字段(比如int转String),必须显式调用对应转换方法(比如toString())。
内容的提问来源于stack exchange,提问作者user18039014
相关产品推荐
相关产品推荐

