浏览 SDKs · Flutter
SDKsFlutter

按 ID 定位消息

按 conversationID 与 clientMsgID 定位一条或多条消息。

复制

搜索结果、引用消息或通知跳转应保存 conversationIDclientMsgID。使用 findMessageList() 按这些稳定标识取回本地已同步消息。

按 clientMsgID 查询消息

final result = await OpenIM.iMManager.messageManager.findMessageList(
  searchParams: [
    SearchParams(
      conversationID: conversationID,
      clientMsgIDList: [clientMsgID],
    ),
  ],
);

final items = result.findResultItems ?? const <SearchResultItems>[];
final messages = items.isEmpty
    ? const <Message>[]
    : (items.first.messageList ?? const <Message>[]);
final target = messages.isEmpty ? null : messages.first;

参数说明

字段类型是否必填说明
conversationIDString?SDK 可选,业务必填目标消息所在的会话 ID。
clientMsgIDListList<String>?SDK 可选,业务必填要定位的消息 ID;单条定位时只传一个。

Future 成功后,匹配项位于 SearchResult.findResultItemsmessageList;缓存尚未同步、消息已删除或 ID 不存在时可能为空,必须先检查列表。

clientMsgID 是 OpenIMSDK 消息在客户端侧的稳定标识。发送、接收、搜索和历史记录都应把它随消息保存;不要用数组下标、显示时间或当前分页长度代替消息标识。

读取前后消息

Flutter 固定 SDK 没有 WASM 的 fetchSurroundingMessages()。定位到 target 后,分别以它为 startMsg 调用 getAdvancedHistoryMessageList()getAdvancedHistoryMessageListReverse(),再按 conversationID:clientMsgID 去重组合前后文。

final older = await OpenIM.iMManager.messageManager
    .getAdvancedHistoryMessageList(
      conversationID: conversationID,
      startMsg: target,
      count: 20,
    );
final newer = await OpenIM.iMManager.messageManager
    .getAdvancedHistoryMessageListReverse(
      conversationID: conversationID,
      startMsg: target,
      count: 20,
    );

合并较旧、目标及较新消息时,应先排除 nullable 或空的 clientMsgID,再按当前 conversationID + clientMsgID 去重;不要依赖两个返回数组中的固定位置标识目标消息。

定位结果可能因本地缓存尚未同步、消息已经删除或撤回而为空。同步完成后可以重试未命中的定位;撤回和删除仍由对应事件归属页的统一处理器更新,本页不重复设置 listener。

获取群聊最新消息

如果只需要显示群聊最后一条消息,例如会话列表或群聊入口,可以读取群组对应的 ConversationInfo

final conversation = await OpenIM.iMManager.conversationManager
    .getOneConversation(
  sourceID: groupID,
  sessionType: ConversationType.superGroup,
);

renderConversationPreview(
  conversationID: conversation.conversationID,
  latestMessage: conversation.latestMsg,
  unreadCount: conversation.unreadCount,
);

Flutter 的 ConversationInfo.latestMsg 已是 nullable Message,不需要像 WASM 的序列化字符串一样执行 JSON 解析。需要打开它所在的上下文时,先确认 latestMsgclientMsgID 有效,再使用当前 conversationID 读取前后消息。

查询结果

findMessageList()、两个方向的历史查询和 getOneConversation() 的 Future 成功后,分别返回本次定位、历史页与会话快照。这些查询都不会触发消息或会话 callback,页面可以直接渲染返回值。

需要显示当前快照时重新执行原查询;重新查询与新消息、撤回、删除等 listener 增量分别处理,并统一按会话标识与 clientMsgID 合并。

相关页面