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

Flutter Dart报错:List无法转为Map<String,dynamic>,求解决方案

问题分析与解决

错误原因

报错核心是服务器返回的JSON是数组(List)格式,但你在循环里反复将整个响应体强制转换为Map类型,类型不匹配导致冲突。具体问题出在parsedFromJson方法中:

  1. 你已经正确将响应体解析为List<dynamic> jsonData,说明返回数据是数组结构
  2. 但循环内重复调用jsonDecode(responseBody)并强转成Map<String,dynamic>,这和实际返回的List类型完全不匹配
  3. 循环逻辑冗余且错误,应该遍历已解析好的jsonData,而非重复解析整个响应体

修正后的代码

1. 简化parsedFromJson方法

直接对解析后的List进行映射,去掉多余循环和重复解析:

List<House_Effects> parsedFromJson(String responseBody) {
  List<dynamic> jsonData = jsonDecode(responseBody);
  return jsonData.map((json) => House_Effects.fromJson(json as Map<String, dynamic>)).toList();
}

2. 修正getDataFromDB的异步调用问题

parsedFromJson是同步方法,不需要添加await:

Future<List<House_Effects>> getDataFromDB() async {
  List<House_Effects> listEffects = [];
  const String bUrl = 'http://17627.9.9.1:4008';
  final response = await http.get(Uri.parse('$bUrl/show'));
  if (response.statusCode == 200) {
    listEffects = parsedFromJson(response.body);
  } else {
    throw Exception('Failed to get data');
  }
  return listEffects;
}

3. 额外优化:日期字段处理

House_Effects.fromJson中的Date字段需要将字符串转为DateTime类型,直接赋值会报错,修改如下:

factory House_Effects.fromJson(Map<String, dynamic> json) {
  return House_Effects(
    ID: json['ID'].toString(),
    Title: json['Title'].toString(),
    Date: json['Date'] != null ? DateTime.parse(json['Date']) : null,
  );
}

关键总结

  • 先确认服务器返回的JSON格式:数组用List接收,单个对象才用Map
  • 避免重复解析JSON,解析一次即可复用
  • 同步方法不要添加await,仅异步方法需要

内容的提问来源于stack exchange,提问作者user27403201

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:22:15