Flutter展示嵌套JSON报String非Map<String,dynamic>子类型错误
问题产生原因
该类型转换异常的核心原因是代码的类型预期和接口实际返回结构不匹配:
- 从提供的接口响应可以看到,返回体里的
data字段是单个JSON对象,存储单条客户信息,实际类型为Map<String, dynamic>,并非数组结构 - 代码中错误地将
map["data"]赋值给List<dynamic>类型的变量,强行把Map类型值按List处理。后续执行遍历逻辑时,实际拿到的是该Map的字符串类型键名(比如"Address"、"CityID"等字段名),将字符串传入要求参数为Map<String, dynamic>的GetCustomer.fromJson()方法,就会触发String is not a subtype of type 'Map<String, dynamic>'的报错。
另外原有代码中Customerlist未指定泛型,也会带来不必要的动态类型风险。
修复方案
按照当前接口实际返回的结构调整解析逻辑即可,修正后的完整代码如下:
// 明确指定列表泛型,避免动态类型隐患 List<GetCustomer> Customerlist = []; Future<List<GetCustomer>> getPostApi() async { final response = await http.post( Uri.parse('xyz'), headers: { "Content-Type": "application/json", "Charset": "utf-8", }, body: jsonEncode({'CustomerID': 1})); if (response.statusCode == 200) { Map<String, dynamic> map = Map<String, dynamic>.from(json.decode(response.body)); // 按实际类型接收data字段,不再强转为List Map<String, dynamic> customerData = map["data"]; Customerlist.clear(); // 将单条客户数据转成模型后加入列表 Customerlist.add(GetCustomer.fromJson(customerData)); return Customerlist; } else { return Customerlist; } }
如果业务需求是拉取多条客户数据、通过ListView展示列表,说明前后端接口约定存在偏差,需要协调后端将data字段的返回值调整为客户对象组成的数组,前端原有的遍历解析逻辑才可正常运行。
内容的提问来源于stack exchange,提问作者Panchal Ravi
相关产品推荐
相关产品推荐

