会话列表
会话列表
对于单聊和群聊,SDK 会在用户收发消息时创建或更新对应的本地会话。你可以从服务端或本地获取会话列表。自 Flutter SDK 4.25.0 起,本地会话列表默认不包含聊天室会话由 ChatOptions.enableChatroomConversation 控制,该选项默认为 false,因此本地会话列表默认不包含聊天室会话。
环信服务器和本地均存储会话,你可以获取会话列表。 服务器默认存储 100 条会话,若提升该上限,需联系环信商务。 如果你的会话条数超过了上限,新会话会覆盖之前的不活跃会话。
前提条件
开始前,请确保满足以下条件:
技术原理
环信即时通讯 IM 通过 ChatManager 类支持从服务器和本地获取会话列表,主要方法如下:
ChatManager#fetchConversationsByOptions:从服务器获取会话列表。ChatManager#fetchConversationsFromDB:分页获取本地会话。ChatManager#loadAllConversations:获取本地所有会话。
从服务器分页获取会话列表
你可以调用 fetchConversationsByOptions 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 0)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。
对于每个终端用户,服务器默认保存最新的 100 条会话。超过此数量限制时,新创建的会话将自动覆盖最早的旧会话。当某个会话中的所有消息记录过期后,该会话即被视为 空会话。默认情况下,从服务端拉取会话列表时不包含空会话。如需要拉取空会话,需在 SDK 初始化时设置 ChatOptions#enableEmptyConversation 为 true。注意,空会话将占用会话拉取名额。若希望拉取会话时不包含空会话,同时避免其占用会话名额,请联系商务开通相关配置。
提示
- 使用该功能前,需 在环信控制台开通服务端会话列表,并将 SDK 升级至 4.5.0 或以上版本。只有开通该功能后,才能使用置顶会话功能。
- 建议仅在 app 安装后或本地没有会话时调用该方法;其他情况下可调用
loadAllConversations获取本地会话。 - 通过 RESTful API 发送的消息默认不会创建或写入会话。如果会话中的最新一条消息通过 RESTful API 发送,获取会话列表时,该会话的最新消息会显示为最近一条通过非 RESTful API 发送的消息。如需让 RESTful API 发送的消息写入会话列表,请 在环信控制台开通该功能。
示例代码如下:
// pageSize:每页查询的会话数量,取值范围为 [1,50]。
try {
final ChatCursorResult<ChatConversation> result =
await ChatClient.getInstance.chatManager.fetchConversationsByOptions(
options: ConversationFetchOptions(),
);
final List<ChatConversation> conversations = result.data;
} on ChatError catch (e) {
// 处理获取失败。
}
从本地获取会话列表
SDK 提供以下方式获取本地会话列表:
初始化 SDK 时,可以通过 ChatOptions 设置以下会话相关选项:
| 选项 | 描述 |
|---|---|
enableChatroomConversation | 设置获取本地会话列表时是否包含聊天室会话。该配置不控制聊天室会话的创建或存储,也不影响聊天室消息的正常收发。 - true:本地会话列表中包含聊天室会话。-(默认) false:本地会话列表中不包含聊天室会话。必须在初始化 SDK 前设置。可读取 ChatOptions.enableChatroomConversation 查询当前配置。 |
deleteMessagesAsExitChatRoom | 设置主动或被动退出聊天室时是否删除该聊天室的本地消息。 -(默认) true:删除本地消息。- false:保留本地消息。 |
enableEmptyConversation | 设置从本地数据库加载会话时是否包含空会话,必须在初始化 SDK 前设置。自 Flutter SDK 4.25.0 起支持。 - true:包含空会话。-(默认) false:不包含空会话。 |
autoLoadConversations | 设置初始化时是否自动将本地数据库中的全部会话加载到内存。该功能自 Flutter SDK 4.25.0 起支持,必须在初始化 SDK 前设置。 -(默认) true:自动加载全部会话。- false:不自动加载全部会话,可通过 fetchConversationsFromDB 按页加载。 |
分页获取本地会话
自 Flutter SDK 4.25.0 起,你可以调用 ChatManager#fetchConversationsFromDB 从本地数据库分页获取会话列表。SDK 优先返回置顶会话。对于置顶状态相同的会话,SDK 按照最新一条消息的服务器时间戳降序排列;若时间戳也相同,则按照会话 ID 降序排列,比较会话 ID 时不区分大小写。
调用该方法前,需在 SDK 初始化时将 ChatOptions#autoLoadConversations 设置为 false,关闭本地会话的自动全量加载。该配置默认为 true;若不关闭,SDK 会在初始化时将数据库中的全部会话加载到内存,无法发挥分页加载在减少初始加载量和内存占用方面的作用。
// SDK 初始化前关闭自动加载全部本地会话。
final ChatOptions options = ChatOptions.withAppKey(
appKey,
autoLoadConversations: false,
);
await ChatClient.getInstance.init(options);
// 首次查询时,cursor 传 null 或空字符串,表示从第一页开始获取。
String? cursor;
const int pageSize = 20; // 取值范围为 [1,100]。
try {
final ChatCursorResult<ChatConversation> result =
await ChatClient.getInstance.chatManager.fetchConversationsFromDB(
cursor: cursor,
pageSize: pageSize,
);
final List<ChatConversation> conversations = result.data;
cursor = result.cursor;
if (cursor == null || cursor!.isEmpty) {
// cursor 为空,表示当前页为最后一页。
} else {
// 保存 cursor;获取下一页时将其作为 cursor 传入。
}
} on ChatError catch (e) {
// cursor 无效时,SDK 抛出错误码为 INVALID_PARAM 的 ChatError。
}
获取本地所有会话
你可以调用 ChatManager#loadAllConversations 获取本地所有会话。SDK 会先从内存中获取;如果内存中没有任何会话,则从本地数据库中获取。
final ChatOptions options = ChatOptions.withAppKey(
appKey,
// 本地会话列表包含聊天室会话。
enableChatroomConversation: true,
// 退出聊天室时保留本地消息。
deleteMessagesAsExitChatRoom: false,
// 从本地数据库加载会话时包含空会话。
enableEmptyConversation: true,
);
await ChatClient.getInstance.init(options);
try {
final List<ChatConversation> conversations =
await ChatClient.getInstance.chatManager.loadAllConversations();
// 成功加载会话。
} on ChatError catch (e) {
// 处理加载失败。
}
如果初始化时将 autoLoadConversations 设置为 false,SDK 不会自动将本地数据库中的全部会话加载到内存。如需按页读取数据库中的会话,请调用 fetchConversationsFromDB,不要使用 loadAllConversations 代替分页加载。
接口列表
| API 名称 | 所属模块/类 | 说明 |
|---|---|---|
fetchConversationsByOptions | ChatManager | 从服务端分页获取会话列表。 |
fetchConversationsFromDB | ChatManager | 从本地数据库分页获取会话列表。 |
loadAllConversations | ChatManager | 获取本地所有会话;优先读取内存,内存中无会话时读取本地数据库。 |
enableChatroomConversation | ChatOptions | 设置获取本地会话列表时是否包含聊天室会话。 |
deleteMessagesAsExitChatRoom | ChatOptions | 设置退出聊天室时是否删除本地消息。 |
enableEmptyConversation | ChatOptions | 设置从本地数据库加载会话时是否包含空会话。自 Flutter SDK 4.25.0 起支持。 |
autoLoadConversations | ChatOptions | 设置初始化时是否自动加载全部本地会话。自 Flutter SDK 4.25.0 起支持。 |
