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

Flutter报错_TypeError: String不是int类型index子类型如何修复

Flutter 类型报错 _TypeError (type 'String' is not a subtype of type 'int' of 'index') 修复方案

这个报错的核心触发逻辑是:代码里尝试用String类型的值作为下标,访问只支持int类型下标索引的List类型对象,结合前后端联调场景,90%的问题出在JSON数据解析环节,具体排查修复方向如下:

  • 优先排查Flutter侧数据解析逻辑
    先在拿到接口响应、解析数据的位置打日志,打印待解析数据的runtimeType:
    1. 如果你写了类似data['list'][index]的取值逻辑,先确认data['list']实际拿到的是List类型还是Map类型——如果后端返回的是JSON对象(对应Flutter里的Map),用int下标访问就会抛这个错
    2. 检查有没有把Map的key写错成int值的情况,比如本来应该写data['id'],误写成data[0]
    3. 空数据场景容错:分页接口无数据时,确认后端返回的是空数组[]而不是空对象{},很多人没做这个判断直接取list[0]就会触发报错
  • PHP后端侧对应修复
    PHP的json_encode函数默认会把非连续数字下标的数组、关联数组序列化成JSON对象(而非JSON数组),Flutter端拿到后会解析成Map类型,无法用int下标访问:
    1. 返回列表类数据时,确保输出的是连续索引数组,不要给列表项手动指定字符串key
    2. 如果对数组做过过滤、键名重组操作,输出前用array_values()重置下标,再做json序列化,参考代码:
    // 错误示例:过滤后数组键名不连续,会被序列化成JSON对象
    $userList = [
        0 => ['id' => 1, 'name' => '张三'],
        2 => ['id' => 3, 'name' => '李四']
    ];
    echo json_encode($userList);
    
    // 正确示例:重置下标后输出标准JSON数组
    echo json_encode(array_values($userList));
    
  • Flutter侧兼容兜底写法
    解析动态数据时不要硬写类型,提前做类型判断,参考:
    final dynamic rawList = response.data['records'];
    List<ArticleModel> articleList = [];
    if (rawList is List) {
      articleList = rawList.map((e) => ArticleModel.fromJson(e as Map<String, dynamic>)).toList();
    }
    // 非List类型直接返回空列表,走无数据逻辑即可
    

快速定位技巧:直接看报错栈里指向的自有dart代码行,看那一行哪个变量是用[x]的形式做了索引访问,打印这个变量的实际类型,1分钟就能定位到问题点。

内容的提问来源于stack exchange,提问作者Narachet Dankasai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:48:23