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:- 如果你写了类似
data['list'][index]的取值逻辑,先确认data['list']实际拿到的是List类型还是Map类型——如果后端返回的是JSON对象(对应Flutter里的Map),用int下标访问就会抛这个错 - 检查有没有把Map的key写错成int值的情况,比如本来应该写
data['id'],误写成data[0] - 空数据场景容错:分页接口无数据时,确认后端返回的是空数组
[]而不是空对象{},很多人没做这个判断直接取list[0]就会触发报错
- 如果你写了类似
- PHP后端侧对应修复
PHP的json_encode函数默认会把非连续数字下标的数组、关联数组序列化成JSON对象(而非JSON数组),Flutter端拿到后会解析成Map类型,无法用int下标访问:- 返回列表类数据时,确保输出的是连续索引数组,不要给列表项手动指定字符串key
- 如果对数组做过过滤、键名重组操作,输出前用
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
相关产品推荐
相关产品推荐

