群组信息
要在Flutter IMKit的UI界面上展示群组的头像、群名称等信息,需要应用层(App)主动向IMKit SDK提供群组信息。
在Flutter IMKit中,同样使用CustomInfoProvider
函数类型来提供群组信息。本文将介绍如何为IMKit提供群组信息,以便在UI界面上展示。
群组信息数据结构
在Flutter IMKit中,群组信息与用户信息使用同一个数据结构RCKChatProfileInfo
,通过isGroup
字段区分:
Dart
class RCKChatProfileInfo {
final String id; // 群组ID
final String name; // 群组名称
final String avatar; // 群组头像URL
final bool isGroup; // 设置为true表示这是群组信息
final String extraInfo; // 额外信息,如群公告等
// 构造函数
RCKChatProfileInfo({
required this.id,
required this.name,
required this.avatar,
this.isGroup = true, // 群组信息设置为true
this.extraInfo = '',
});
}
提供群组信息
在应用中,您需要在CustomInfoProvider
函数中同时处理用户信息和群组信息的请求:
Dart
Future<RCKChatProfileInfo> customInfoProvider(
{RCIMIWMessage? message, RCIMIWConversation? conversation}) async {
String targetId = '';
bool isGroup = false;
// 确定目标ID和类型
if (message != null) {
// 消息场景 下,通常是获取发送者信息
targetId = message.senderUserId ?? '';
// 对于群聊消息,可能需要特别判断
// isGroup = message.conversationType == RCIMIWConversationType.group;
} else if (conversation != null) {
// 会话场景下,获取会话目标信息
targetId = conversation.targetId ?? '';
isGroup = conversation.conversationType == RCIMIWConversationType.group;
}
// 如果 是群组信息请求
if (isGroup) {
// 从您的群组信息提供者获取信息
final groupInfo = await yourGroupInfoProvider.getGroupInfo(targetId);
return RCKChatProfileInfo(
id: targetId,
name: groupInfo?.groupName ?? '未知群组',
avatar: groupInfo?.groupAvatar ?? '',
isGroup: true,
extraInfo: groupInfo?.announcement ?? '',
);
} else {
// 处理用户信息请求...
// ...
}
}
群组信息缓存
与用户信息类似,群组信息也建议实现缓存机制以提高性能:
Dart
class GroupInfoCache {
// 群组信息缓存
final Map<String, GroupInfo> _groupCache = {};
// 正在获取的群组ID集合
final Set<String> _fetchingGroupIds = {};
// 获取群组信息
Future<GroupInfo?> getGroupInfo(String groupId) async {
// 如果缓存中已有数据,直接返回
if (_groupCache.containsKey(groupId)) {
return _groupCache[groupId];
}
// 避免重复请求
if (_fetchingGroupIds.contains(groupId)) {
// 等待直到获取完成
while (_fetchingGroupIds.contains(groupId)) {
await Future.delayed(const Duration(milliseconds: 100));
}
if (_groupCache.containsKey(groupId)) {
return _groupCache[groupId];
}
}
// 标记为正在获取
_fetchingGroupIds.add(groupId);
try {
// 从服务器获取群组信息
final groupInfo = await _fetchGroupInfoFromServer(groupId);
if (groupInfo != null) {
// 添加到缓存
_groupCache[groupId] = groupInfo;
}
return groupInfo;
} finally {
// 清除标记
_fetchingGroupIds.remove(groupId);
}
}
// 从服务器获取群组信息
Future<GroupInfo?> _fetchGroupInfoFromServer(String groupId) async {
// 实现从服务器获取群组信息的逻辑
// ...
}
}