管理聊天室
更新时间:2022-09-07
聊天室是支持多人沟通的即时通讯系统。聊天室中的成员没有固定关系,用户离线后,超过 5 分钟会自动退出聊天室。聊天室成员在离线后,不会收到推送消息。聊天室可以应用于直播、消息广播等。
本文指导你如何使用环信即时通讯 IM Flutter SDK 在实时互动 app 中实现聊天室的相关功能。
技术原理
环信即时通讯 IM Flutter SDK 提供 EMChatRoom
、EMRoomManager
和 EMChatRoomEventHandler
类用于聊天室管理,支持你通过调用 API 在项目中实现如下功能:
- 创建、解散聊天室
- 加入、退出聊天室
- 获取聊天室详情
- 从服务器获取聊天室列表
- 监听聊天室事件
前提条件
开始前,请确保满足以下条件:
- 完成 SDK 初始化,详见 快速开始;
- 了解环信即时通讯 IM API 的接口调用频率限制,详见 使用限制;
- 了解聊天室的数量限制,详见 套餐包详情;
- 只有超级管理员才有创建聊天室的权限,因此你还需要确保已调用 RESTful API 添加了超级管理员,详见 添加聊天室超级管理员。 聊天室创建者和管理员的数量之和不能超过 100,即管理员最多可添加 99 个。
实现方法
本节介绍如何使用环信即时通讯 IM SDK 提供的 API 实现上述功能。
创建聊天室
仅 超级管理员 可以调用 EMChatRoomManager#createChatRoom
方法创建聊天室,并设置聊天室的名称、描述、最大成员数等信息。成功创建聊天室后,该超级管理员为聊天室所有者。
示例代码如下:
try {
EMChatRoom room = await EMClient.getInstance.chatRoomManager.createChatRoom(name);
} on EMError catch (e) {
}
解散聊天室
仅聊天室所有者可以调用 EMChatRoomManager#destroyChatRoom
方法解散聊天室。聊天室解散时,其他聊天室成员收到 EMChatRoomEventHandler#onChatRoomDestroyed
事件并被踢出聊天室。
示例代码如下:
try {
await EMClient.getInstance.chatRoomManager.destroyChatRoom(roomId);
} on EMError catch (e) {
}
加入聊天室
用户申请加入聊天室的步骤如下:
- 调用
EMChatRoomManager#fetchPublicChatRoomsFromServer
方法从服务器获取聊天室列表,查询到想要加入的聊天室 ID。 - 调用
EMChatRoomManager#joinChatRoom
方法传入聊天室 ID,申请加入对应聊天室。新成员加入聊天室时,其他成员收到EMChatRoomEventHandler#onMemberJoinedFromChatRoom
事件。
示例代码如下:
// 获取公开聊天室列表
try {
EMPageResult<EMChatRoom> result = await EMClient
.getInstance.chatRoomManager
.fetchPublicChatRoomsFromServer(
pageNum: pageNum,
pageSize: pageSize,
);
} on EMError catch (e) {
}
// 加入聊天室
try {
await EMClient.getInstance.chatRoomManager.joinChatRoom(roomId);
} on EMError catch (e) {
}
退出聊天室
聊天室所有成员均可以调用 EMChatRoomManage#leaveChatRoom
方法退出指定聊天室。成员退出聊天室时,其他成员收到 onMemberExitedFromChatRoom
回调。 与群主无法退出群组不同,聊天室所有者可以离开聊天室,例如所有者从服务器下线则 5 分钟后自动离开聊天室。如果所有者重新进入聊天室还是这个聊天室的所有者。
示例代码如下:
try {
await EMClient.getInstance.chatRoomManager.leaveChatRoom(roomId);
} on EMError catch (e) {
}
离开聊天室时,SDK 默认删除该聊天室的所有本地消息,若要保留这些消息,在初始化 SDK 时将 EMOptions#deleteMessagesAsExitChatRoom
设置为 false
。
示例代码如下:
EMOptions options = EMOptions(
appKey: APPKEY,
deleteMessagesAsExitChatRoom: false,
);
获取聊天室详情
聊天室成员可以调用 EMChatManager#fetchChatRoomInfoFromServer
获取聊天室详情,包括聊天室 ID、聊天室名称,聊天室描述、聊天室公告、管理员列表、成员列表、黑名单列表、禁言列表、最大成员数、聊天室所有者、是否全员禁言以及聊天室权限类型。
示例代码如下:
try {
EMChatRoom room = await EMClient.getInstance.chatRoomManager.fetchChatRoomInfoFromServer(roomId);
} on EMError catch (e) {
}
监听聊天室事件
EMChatRoomEventHandler
类中提供了聊天室事件的监听接口。你可以通过注册聊天室监听器,获取聊天室事件,并作出相应处理。如不再使用该监听,需要移除,防止出现内存泄露。
示例代码如下:
// 注册监听
EMClient.getInstance.chatRoomManager.addEventHandler(
"UNIQUE_HANDLER_ID",
EMChatRoomEventHandler(),
);
// 移除监听
EMClient.getInstance.chatRoomManager.removeEventHandler("UNIQUE_HANDLER_ID");