类型'List<dynamic>'不是'FutureOr<List<Map<String,String>>>子类型错误排查
解决Dart中List转List<Map<String, String>>类型不匹配问题
直接用as强制类型转换失败的原因是:json.decode返回的List<dynamic>内部元素是Map<String, dynamic>,Dart类型系统不允许嵌套泛型集合直接跨类型强转。你需要逐个遍历元素,将每个Map<String, dynamic>转为Map<String, String>,同时处理null值(比如示例里的Status: null,因为String类型不能接收null)。
修改后的函数代码如下:
Future<List<Map<String, String>>> getServerList() async { //... // 明确指定res为String类型 String res = await SqlConn.readData("declare @Status nvarchar(4000) exec spHandheldServerList @Status output"); //... // 解析为List<dynamic> List<dynamic> decodedData = json.decode(res); // 遍历转换每个元素,处理null值 List<Map<String, String>> serverList = decodedData.map((item) { // 将每个Map<String, dynamic>转换为Map<String, String> return Map.fromEntries( (item as Map<String, dynamic>).entries.map((entry) { // 将null转为空字符串,或根据业务需求设置默认值 String value = entry.value?.toString() ?? ""; return MapEntry(entry.key, value); }) ); }).toList(); return serverList; }
关键说明:
- 逐个元素转换:通过
map遍历解析后的列表,对每个字典做类型转换,确保每个键值对符合String类型要求。 - 处理null值:用
entry.value?.toString() ?? ""把null转为空字符串,避免因null无法赋值给String类型报错。 - 类型安全:显式将
item转为Map<String, dynamic>,让类型检查器明确元素类型,避免隐式转换的潜在问题。
如果业务场景允许值为null,可以把返回类型改为Future<List<Map<String, String?>>>,转换会更简洁:
Future<List<Map<String, String?>>> getServerList() async { //... String res = await SqlConn.readData("declare @Status nvarchar(4000) exec spHandheldServerList @Status output"); List<dynamic> decodedData = json.decode(res); List<Map<String, String?>> serverList = decodedData .map((item) => Map<String, String?>.from(item as Map<String, dynamic>)) .toList(); return serverList; }
内容的提问来源于stack exchange,提问作者TheMortiestMorty
相关产品推荐
相关产品推荐

