Flutter WebSocket插入数据时报String不是int索引子类型错误如何解决
报错根本原因
- 核心原因是你对String类型的变量使用了字符串键进行下标访问:Dart中只有List/Map类型支持用下标取值,List要求下标为int类型,如果你把String类型的变量当成Map用
data['key']的方式访问,就会抛出「需要int类型的index,但传入了String」的类型错误。 - 结合你的代码场景,触发这个问题的具体诱因有两个:
- WebSocket回调返回的
data默认是原始JSON字符串,你没有提前调用jsonDecode将其转为Dart的Map类型,直接用字符串键取值触发报错。 - 就算
data已转为Map,你原代码中访问嵌套字段时存在类型/键名不匹配:比如你取data['userId']['_id'],但服务端返回的userId字段下的主键是id而非_id,如果data['userId']因为解析问题变成了String类型,再次用字符串键访问也会触发同类型报错。
- WebSocket回调返回的
修复方案合理性评估
你的修复方案部分有效,可优化点如下:
- 合理的点:
- 用
UserModelForPost.fromJson统一解析嵌套的用户数据,避免手动写嵌套字段的键名出错,也内置了类型校验逻辑,大幅降低下标访问错误概率。 - 给
id字段主动调用toString(),避免服务端返回的id类型和Post类定义的字段类型不匹配。
- 用
- 缺少的核心修复步骤(必须补充):
回调拿到data后首先要做JSON解析,确保你操作的是Map类型,示例代码如下:import 'dart:convert'; socket!.on('post-created', (rawData) { // 第一步:先解析原始数据为Map Map<String, dynamic> data = jsonDecode(rawData); // 再执行后续的Post实例化逻辑 Post newPost = Post( date: DateTime.now(), id: data['_id'].toString(), likeCount: 0, liked: false, photo: data["photo"]?.toString() ?? '', text: data['text'].toString(), userId: UserModelForPost.fromJson(data['userId']), v: data['__v'] as int, ); widget.posts.insert(0, newPost); }); - 额外注意点:原代码中你访问
data['userId']['photoXs'],但服务端返回的用户头像字段是photo,需要在UserModelForPost.fromJson里对应正确的键名,避免取到空值。
内容的提问来源于stack exchange,提问作者Emir Kutlugün
相关产品推荐
相关产品推荐

