Flutter类型错误:'String'不是'index'的'int'子类型求助
问题排查与解决方案
错误原因分析
你遇到的'String' is not a subtype of type 'int' of 'index'错误,核心是错误使用索引类型(用字符串索引数组,或用整数索引Map),结合你的代码和返回的JSON数据,具体问题点如下:
地址数据路径完全错误
实际返回的JSON中,地址信息存储在根节点的addresses数组里,但你的代码却去访问client对象下的direction和shippingAddressList——而这两个字段在JSON里都是null。尝试对null使用数组索引[0](整数类型),会直接触发类型不匹配错误。代码示例2的层级错误
你写的jsonDecode(...)['data']['addresses']中,返回的JSON根节点没有data字段,['data']会返回null,后续用字符串索引['addresses']访问null时,就会触发“String不是int类型的index”错误。字段名不匹配
代码中使用的noInterior、noOutdoor、coordinatesCode等字段名,和JSON地址对象里的interiorNumber、outdoorNumber、coordinateCode完全不匹配,会导致获取到null,进一步引发后续操作的类型问题。
正确实现代码
步骤1:正确解析地址数组
// 解析接口返回的原始数据 final responseData = jsonDecode(utf8.decode(response.bodyBytes)); // 直接获取根节点的addresses数组(注意拼写是addresses,不是adresses) List<dynamic> addresses = responseData['addresses'];
步骤2:构造目标接口需要的地址格式
// 构造要发送给另一个接口的地址列表 List<Map<String, dynamic>> targetAddresses = []; for (var addr in addresses) { // 按目标接口要求组装字段,可替换为你的自定义变量(如estadoCliente等) Map<String, dynamic> addressItem = { "id": addr['id'], "street": addr['street'], "colony": addr['colony'], "state": addr['state'], // 替换为你的estadoCliente变量 "stateCode": addr['stateCode'], "delegation": addr['delegation'], // 替换为你的mudegCliente变量 "delegationCode": addr['delegationCode'], "interiorNumber": addr['interiorNumber'], "outdoorNumber": addr['outdoorNumber'], "cp": addr['cp'], "city": addr['city'], "addressType": addr['addressType'], "flat": addr['flat'], // 替换为你的fatCliente变量 "flatCode": addr['flatCode'], "coordinate": addr['coordinate'], // 替换为你的coordCliente变量 "coordinateCode": addr['coordinateCode'], }; targetAddresses.add(addressItem); } // 将targetAddresses作为请求体发送到目标接口
额外建议
- 空值处理:如果JSON字段可能为
null,建议添加空值兜底,比如addr['id'] ?? '',避免后续序列化报错。 - 类型安全:推荐使用
json_serializable生成实体类,将JSON解析为强类型对象,彻底避免动态类型带来的类型错误。比如创建Address类,通过注解自动生成解析代码。
内容的提问来源于stack exchange,提问作者Kevin Mendoza
相关产品推荐
相关产品推荐

