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

Flutter WebSocket插入数据时报String不是int索引子类型错误如何解决

报错根本原因
  • 核心原因是你对String类型的变量使用了字符串键进行下标访问:Dart中只有List/Map类型支持用下标取值,List要求下标为int类型,如果你把String类型的变量当成Map用data['key']的方式访问,就会抛出「需要int类型的index,但传入了String」的类型错误。
  • 结合你的代码场景,触发这个问题的具体诱因有两个:
    1. WebSocket回调返回的data默认是原始JSON字符串,你没有提前调用jsonDecode将其转为Dart的Map类型,直接用字符串键取值触发报错。
    2. 就算data已转为Map,你原代码中访问嵌套字段时存在类型/键名不匹配:比如你取data['userId']['_id'],但服务端返回的userId字段下的主键是id而非_id,如果data['userId']因为解析问题变成了String类型,再次用字符串键访问也会触发同类型报错。
修复方案合理性评估

你的修复方案部分有效,可优化点如下:

  • 合理的点:
    • 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:06:02