浏览 SDKs · Flutter
平台
SDKsFlutter

搜索消息

在 Flutter SDK 已同步的本地消息中按关键词与会话条件搜索。

复制

searchLocalMessages() 搜索当前用户本地已同步消息。群聊目标使用对应的 conversationID,不是发送时使用的 groupID

如果入口只有用户 ID 或群组 ID,先调用 getConversationIDBySessionType(sourceID:, sessionType:) 换取会话 ID;单聊使用 ConversationType.single,群聊按实际会话类型使用对应值。全局搜索则省略 conversationID

搜索范围来自 SDK 已同步到当前设备本地缓存的消息。服务端全量检索或跨会话全局排序不属于本方法的能力范围;这类结果可以由后端搜索服务返回对应的会话和消息标识,再由客户端定位。

创建搜索查询

keywordList 接收关键词列表,但当前只使用一个关键词。搜索框提交前应去掉首尾空格并过滤空值。

final keyword = input.trim();
if (keyword.isNotEmpty) {
  final result = await OpenIM.iMManager.messageManager.searchLocalMessages(
    conversationID: conversationID,
    keywordList: [keyword],
    messageTypeList: [MessageType.text, MessageType.atText],
    pageIndex: 1,
    count: 20,
  );
  renderSearchResult(result);
}

高级搜索

searchLocalMessages() 还提供消息类型和时间窗口等筛选字段。keywordListMatchTypesenderUserIDList 当前不参与搜索;发送者筛选可以由其他业务搜索能力提供。

final result = await OpenIM.iMManager.messageManager.searchLocalMessages(
  conversationID: conversationID,
  keywordList: ['release'],
  messageTypeList: [MessageType.text],
  searchTimePosition: searchTimePosition,
  searchTimePeriod: searchTimePeriod,
  pageIndex: 1,
  count: 20,
);

如果搜索入口允许搜索图片、文件或自定义消息,把对应的 MessageType 数字常量加入 messageTypeList。不需要限制消息类型时,使用默认空列表;不同内容类型是否支持关键词匹配取决于其本地索引内容。

参数说明

参数类型是否必填说明
conversationIDString?指定会话;为 null 时搜索本地全部会话。
keywordListList<String>默认为空列表;执行关键词搜索时传一个清理后的非空关键词。当前只使用一个关键词。
keywordListMatchTypeint默认 0;多关键词匹配字段当前实现未使用。
senderUserIDListList<String>默认空列表;当前未使用。
messageTypeListList<int>消息类型数字列表,例如 MessageType.text;默认空列表。
searchTimePositionintUTC 秒级时间起点,默认 0,表示从当前时间开始。
searchTimePeriodint向过去搜索的秒数,默认 0,表示不限制。
pageIndexint页码从 1 开始,默认 1
countint每页数量,默认 40

处理分页结果

返回 SearchResult,以下字段均为 nullable:

字段类型说明
totalCountint?本次条件匹配的消息总数。
searchResultItemsList<SearchResultItems>?searchLocalMessages() 按会话组织的结果。
findResultItemsList<SearchResultItems>?findMessageList() 使用的结果,不是本操作的主要结果字段。

每个 SearchResultItems 对应一个会话:

字段类型说明
conversationIDString?命中消息所属会话 ID。
conversationTypeint?会话类型值。
showNameString?会话展示名称。
faceURLString?会话头像地址。
messageCountint?该会话内的命中数量。
messageListList<Message>?该会话内本页命中的消息。

继续分页时保持关键词、发送者、类型和时间条件不变,只增加 pageIndex;修改任一条件时重置为第 1 页并清空旧结果。同一搜索页按结果项的 conversationID 与消息的 nullable clientMsgID 去重,不能按结果位置保存选中项。

getConversationIDBySessionType()searchLocalMessages() 的 Future 成功后,直接使用返回的会话 ID 和搜索结果。两个查询都不会触发消息事件。

处理搜索结果变化

搜索命中的消息可能在页面打开后被撤回、删除,或由新的同步数据补充。应使用接收消息删除消息撤回消息中的统一处理器更新结果;本页只负责搜索与分页,不重复设置消息 listener。

跳转到命中消息时,使用结果项的 conversationID 和消息的 clientMsgID 定位。需要展示前后文时,按按 ID 定位消息分别读取较旧与较新的消息。

需要显示当前时刻的搜索结果时,可以用相同条件重新执行查询。搜索 Future、后续消息事件和重新查询是三条独立路径。

相关页面