You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类型'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:40:05