按 ID 定位消息
按 conversationID 与 clientMsgID 定位一条或多条消息。
从搜索结果、引用回复或系统通知跳转至聊天界面时,通常需要依据 conversationID 与 clientMsgID 取回本地已同步的消息实体:
按 clientMsgID 查询消息
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
conversationID | String | 是 | 目标消息所在的会话 ID。 |
clientMsgIDList | List<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 幂等合并状态。
相关页面
这个页面有帮助吗?