按 ID 定位消息
按 conversationID 与 clientMsgID 定位一条或多条消息。
搜索结果、引用消息或通知跳转应保存 conversationID 和 clientMsgID。使用 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;参数说明
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
conversationID | String? | SDK 可选,业务必填 | 目标消息所在的会话 ID。 |
clientMsgIDList | List<String>? | SDK 可选,业务必填 | 要定位的消息 ID;单条定位时只传一个。 |
Future 成功后,匹配项位于 SearchResult.findResultItems 的 messageList;缓存尚未同步、消息已删除或 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 解析。需要打开它所在的上下文时,先确认 latestMsg 和 clientMsgID 有效,再使用当前 conversationID 读取前后消息。
查询结果
findMessageList()、两个方向的历史查询和 getOneConversation() 的 Future 成功后,分别返回本次定位、历史页与会话快照。这些查询都不会触发消息或会话 callback,页面可以直接渲染返回值。
需要显示当前快照时重新执行原查询;重新查询与新消息、撤回、删除等 listener 增量分别处理,并统一按会话标识与 clientMsgID 合并。
相关页面
这个页面有帮助吗?