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

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取值,就会抛出这个异常。

结合你的代码和调用栈可以直接定位问题范围:

  1. 报错点精确在HomePage.dart第283行,就是你写地址渲染的那串链式取值代码:widget.infosUser['address']['address']...widget.infosUser['address']['city']['region']['name']
  2. 这串链式取值里至少有一个层级的实际数据类型和你预期的Map不符,常见场景包括:
    • 某一层嵌套数据是未解码的JSON字符串:比如接口返回的address字段本身是个JSON格式的字符串,你没有调用jsonDecode转成Map就直接用key取值,对String类型传字符串key就会直接触发这个错
    • 某一层嵌套数据实际是数组/List类型:比如region字段接口返回的是区域列表,不是单个区域对象,你当成单对象Map用key取值就会报错
    • 某一层字段值为null,类型转换逻辑异常导致拿到的对象类型不符合预期
  3. 你在路由跳转时直接把接口返回的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组件渲染即可
    
  • 根源修复:
    1. 接口返回的所有JSON数据要完整解码,所有嵌套的JSON字符串都要通过jsonDecode转成Map/List类型后再使用
    2. 不要直接用动态类型的Map跨页面传业务数据,给用户、地址、城市、区域这些业务结构写对应的实体类,在fromJson序列化阶段就做类型校验,从源头过滤结构异常的数据
    3. 跨页面传参时优先传序列化后的实体类对象,不要直接传Map类型的动态数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:27:49