浏览 SDKs · Flutter
平台
SDKsFlutter

按 ID 定位消息

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

复制

从搜索结果、引用回复或系统通知跳转至聊天界面时,通常需要依据 conversationID 与 clientMsgID 取回本地已同步的消息实体:

按 clientMsgID 查询消息

参数说明

参数类型是否必填说明
conversationIDString是目标消息所在的会话 ID。
clientMsgIDListList<String>是需定位的客户端消息 ID 列表;定位单条时传入单个元素。
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;

Future 成功后,匹配到的消息位于 SearchResult.findResultItems 的 messageList 中;若本地未缓存、消息已被物理删除或 ID 不存在,返回列表可能为空,使用前需做判空校验。

clientMsgID 是客户端侧维护的稳定唯一主键。发送、接收、搜索和历史记录均应以其作为消息合并凭据,不得使用列表索引或界面展示时间替代。

读取前后消息

客户端在定位到目标消息后,若需还原该消息前后的完整聊天上下文,可分别以该消息作为游标,调用加载历史消息拉取更早消息,并调用反向加载历史消息 商业版拉取更晚消息,最后按复合标识 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 去重;不要依赖两个返回数组中的固定位置标识目标消息。

定位结果可能因本地缓存尚未同步、消息已经删除或撤回而为空。同步完成后可以重试未命中的定位;撤回与删除等变更由消息事件统一监听器集中处理,避免在各业务组件中分散注册监听。

获取群聊最新消息

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

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

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

ConversationInfo.latestMsg 是 nullable 的 Message,不需要执行 JSON 解析。需要打开它所在的上下文时,先确认 latestMsg 和 clientMsgID 有效,再使用当前 conversationID 读取前后消息。

返回结果

定位消息查询、前后历史拉取与会话信息获取均属于只读操作,Future 成功后返回调用当时的数据快照,不会触发任何事件通知。

界面展示可直接使用返回结果进行渲染。后续发生的新消息、撤回、删除等变动应通过全局监听器统一处理,并严格以复合标识 conversationID:clientMsgID 幂等合并状态。

相关页面