Flutter Dart报错:List无法转为Map<String,dynamic>,求解决方案
问题分析与解决
错误原因
报错核心是服务器返回的JSON是数组(List)格式,但你在循环里反复将整个响应体强制转换为Map类型,类型不匹配导致冲突。具体问题出在parsedFromJson方法中:
- 你已经正确将响应体解析为
List<dynamic> jsonData,说明返回数据是数组结构 - 但循环内重复调用
jsonDecode(responseBody)并强转成Map<String,dynamic>,这和实际返回的List类型完全不匹配 - 循环逻辑冗余且错误,应该遍历已解析好的
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
相关产品推荐
相关产品推荐

