Flutter type 'String' is not subtype of 'int' index 数据获取报错
错误触发原因
这个_TypeError: type 'String' is not a subtype of type 'int' of 'index'错误的核心逻辑是:你对一个只支持int类型下标索引的对象,传入了字符串类型的key去取值。
Dart中只有Map类型支持用字符串键做索引,List、String类型的[]操作符只接受int类型参数(前者按下标取数组元素,后者按下标取字符串对应位置的字符),一旦你对非Map类型的值传字符串key取值,就会抛出这个异常。
结合你的代码和调用栈可以直接定位问题范围:
- 报错点精确在
HomePage.dart第283行,就是你写地址渲染的那串链式取值代码:widget.infosUser['address']['address']...widget.infosUser['address']['city']['region']['name'] - 这串链式取值里至少有一个层级的实际数据类型和你预期的
Map不符,常见场景包括:- 某一层嵌套数据是未解码的JSON字符串:比如接口返回的
address字段本身是个JSON格式的字符串,你没有调用jsonDecode转成Map就直接用key取值,对String类型传字符串key就会直接触发这个错 - 某一层嵌套数据实际是数组/List类型:比如
region字段接口返回的是区域列表,不是单个区域对象,你当成单对象Map用key取值就会报错 - 某一层字段值为null,类型转换逻辑异常导致拿到的对象类型不符合预期
- 某一层嵌套数据是未解码的JSON字符串:比如接口返回的
- 你在路由跳转时直接把接口返回的
infosUser动态类型对象原封不动传入HomePage,没有做任何结构校验,是导致异常数据进入渲染层的直接原因。
排查步骤
- 定位到
HomePage.dart第283行的链式取值代码,逐层级打印每个节点的实际类型,找到类型不符合预期的节点:
哪个节点打印出来不是print('infosUser类型: ${widget.infosUser.runtimeType}'); print('address节点类型: ${widget.infosUser['address'].runtimeType}'); print('city节点类型: ${widget.infosUser['address']['city'].runtimeType}'); print('region节点类型: ${widget.infosUser['address']['city']['region'].runtimeType}');Map<String, dynamic>,就是错误发生的具体位置。 - 抓包查看接口返回的原始JSON结构,对照你写的字段取值路径,确认有没有把数组、字符串类型的字段误当成对象处理,不要靠记忆写字段路径。
- 检查接口响应处理逻辑,确认所有嵌套的JSON结构都做了解码,没有把未解码的JSON字符串直接塞进
infosUser对象。
修复方案
- 临时快速修复:在取值前加类型校验,遇到结构不符合预期的数据时做降级处理,避免直接崩溃:
String addressDisplay = ''; final userInfo = widget.infosUser; if (userInfo is Map && userInfo['address'] is Map) { final addressMap = userInfo['address'] as Map; final street = addressMap['address']?.toString() ?? ''; if (addressMap['city'] is Map) { final cityMap = addressMap['city'] as Map; final cityName = cityMap['name']?.toString() ?? ''; if (cityMap['region'] is Map) { final regionMap = cityMap['region'] as Map; final regionName = regionMap['name']?.toString() ?? ''; addressDisplay = "$street, $cityName, $regionName,"; } } } // 把addressDisplay传给Text组件渲染即可 - 根源修复:
- 接口返回的所有JSON数据要完整解码,所有嵌套的JSON字符串都要通过
jsonDecode转成Map/List类型后再使用 - 不要直接用动态类型的Map跨页面传业务数据,给用户、地址、城市、区域这些业务结构写对应的实体类,在
fromJson序列化阶段就做类型校验,从源头过滤结构异常的数据 - 跨页面传参时优先传序列化后的实体类对象,不要直接传Map类型的动态数据。
- 接口返回的所有JSON数据要完整解码,所有嵌套的JSON字符串都要通过
内容的提问来源于stack exchange,提问作者Boucounta Ba
相关产品推荐
相关产品推荐

