目录

管理群组 Flutter

更新时间:2022-09-07

群组是支持多人沟通的即时通讯系统,本文指导你如何使用环信即时通讯 IM Flutter SDK 在实时互动 app 中创建并管理群组。

技术原理

环信即时通讯 IM Flutter SDK 提供 EMGroupEMGroupManagerEMGroupEventHandler 类用于群组管理,支持你通过调用 API 在项目中实现如下功能:

前提条件

开始前,请确保满足以下条件:

实现方法

本节介绍如何使用环信即时通讯 IM Flutter SDK 提供的 API 实现上述功能。

创建群组

在创建群组前,你需要设置群组类型 (EMGroupStyle) 和进群邀请是否需要对方同意 (inviteNeedConfirm)。

  1. 群组类型 (GroupStyle) 的具体设置如下:
  1. 进群邀请是否需要对方同意 (inviteNeedConfirm) 的具体设置如下:

用户可以调用 EMGroupManager#createGroup 方法创建群组。

示例代码如下:

EMGroupOptions groupOptions = EMGroupOptions(
  style: EMGroupStyle.PrivateMemberCanInvite,
  inviteNeedConfirm: true,
);

String groupName = "newGroup";
String groupDesc = "group desc";
try {
  await EMClient.getInstance.groupManager.createGroup(
    groupName: groupName,
    desc: groupDesc,
    options: groupOptions,
  );
} on EMError catch (e) {
}

解散群组

仅群主可以调用 DestroyGroup 方法解散群组。群组解散时,其他群组成员收到 OnDestroyedFromGroup 回调并被踢出群组。

注意: 解散群组后,将删除本地数据库及内存中的群相关信息及群会话,谨慎操作。

示例代码如下:

try {
  await EMClient.getInstance.groupManager.destroyGroup("groupId");
} on EMError catch (e) {}

加入群组

根据 创建群组 时的群组类型 (GroupStyle) 设置,加入群组的处理逻辑差别如下:

注意 用户只能申请加入公开群组,私有群组不支持用户申请入群。

用户申请加入群组的步骤如下:

  1. 调用 EMGroupManager#fetchPublicGroupsFromServer 方法从服务器获取公开群列表,查询到想要加入的群组 ID。
  2. 调用 EMGroupManager#joinPublicGroup 方法传入群组 ID,申请加入对应群组。

示例代码如下:

// 获取公开群组列表
try {
  EMCursorResult<EMGroupInfo> result =
      await EMClient.getInstance.groupManager.fetchPublicGroupsFromServer();
} on EMError catch (e) {
}

// 申请加入群组
try {
  await EMClient.getInstance.groupManager.joinPublicGroup(groupId);
} on EMError catch (e) {
}

退出群组

群成员可以调用 LeaveGroup 方法退出群组,其他成员收到 EMGroupEventHandler#onMemberExitedFromGroup 回调。退出群组后,该用户将不再收到群消息。群主不能调用该接口退出群组,只能调用 ''%%DestroyGroup%%'' 解散群组。

示例代码如下:

try {
  await EMClient.getInstance.groupManager.leaveGroup(groupId);
} on EMError catch (e) {
}

获取群组详情

群成员可以调用 EMGroupManager#getGroupWithId 方法从内存获取群组详情。返回结果包括:群组 ID、群组名称、群组描述、群组基本属性、群主、群组管理员列表,默认不包含群成员。

群成员也可以调用 EMGroupManager#fetchGroupInfoFromServer 方法从服务器获取群组详情。返回结果包括:群组 ID、群组名称、群组描述、群主、群组管理员列表以及群成员列表。

示例代码如下:

// 从本地获取群组
try {
  EMGroup? group = await EMClient.getInstance.groupManager.getGroupWithId(groupId);
} on EMError catch (e) {
}

// 从服务器获取群组详情
try {
  EMGroup group = await EMClient.getInstance.groupManager.fetchGroupInfoFromServer(groupId);
} on EMError catch (e) {
}

获取群成员列表

群成员可以调用 EMGroupManager#fetchMemberListFromServer 方法从服务器分页获取群成员列表。

示例代码如下:

try {
  EMCursorResult<String> result =
      await EMClient.getInstance.groupManager.fetchMemberListFromServer(
    groupId,
  );
} on EMError catch (e) {
}

获取群组列表

用户可以调用 EMGroupManager#fetchJoinedGroupsFromServer 方法从服务器获取自己加入和创建的群组列表。示例代码如下:

try {
  List<EMGroup> list =
      await EMClient.getInstance.groupManager.fetchJoinedGroupsFromServer();
} on EMError catch (e) {
}

用户可以调用 EMGroupManager#getJoinedGroups 方法加载本地群组列表。为了保证数据的正确性,需要先从服务器获取自己加入和创建的群组列表。示例代码如下:

try {
  List<EMGroup> list =
      await EMClient.getInstance.groupManager.getJoinedGroups();
} on EMError catch (e) {
}

用户还可以调用 EMGroupManager#fetchPublicGroupsFromServer 方法从服务器分页获取公开群组列表。示例代码如下:

try {
  EMCursorResult<EMGroupInfo> result =
      await EMClient.getInstance.groupManager.fetchPublicGroupsFromServer(
    pageSize: pageSize,
    cursor: cursor,
  );
} on EMError catch (e) {
}

屏蔽和解除屏蔽群消息

屏蔽群消息

群成员可以调用 EMGroupManager#blockGroup 方法屏蔽群消息。屏蔽群消息后,该成员不再从指定群组接收群消息。示例代码如下:

try {
  await EMClient.getInstance.groupManager.blockGroup(groupId);
} on EMError catch (e) {
}

解除屏蔽群消息

群成员可以调用 EMGroupManager#unblockGroup 方法解除屏蔽群消息。示例代码如下:

try {
  await EMClient.getInstance.groupManager.unblockGroup(groupId);
} on EMError catch (e) {
}

检查自己是否屏蔽群消息

群成员可以调用 EMGroupManager#fetchGroupInfoFromServer 方法并通过 EMGroup#messageBlocked 字段检查自己是否屏蔽了群消息。

示例代码如下:

try {
  EMGroup group = await EMClient.getInstance.groupManager
      .fetchGroupInfoFromServer(groupId);
  // 检查用户是否屏蔽了该群的群消息
  if (group.messageBlocked == true) {

  }
} on EMError catch (e) {
}

监听群组事件

EMGroupEventHandler 类中提供群组事件的监听接口。开发者可以通过设置此监听,获取群组中的事件,并做出相应处理。如果不再使用该监听,需要移除,防止出现内存泄漏。

示例代码如下:

// 注册监听
EMClient.getInstance.groupManager.addEventHandler(
  "UNIQUE_HANDLER_ID",
  EMGroupEventHandler(),
);

// 移除监听
EMClient.getInstance.groupManager.removeEventHandler("UNIQUE_HANDLER_ID");