Optimize the logic for retrieving the group member list when monitoring group members entering and leaving.

This commit is contained in:
vinsonswang 2025-12-04 14:56:11 +08:00
parent 214558c7f4
commit 25a7c0e990
8 changed files with 82 additions and 14 deletions

View File

@ -1,3 +1,6 @@
# 5.0.1+4
* Optimize the logic for retrieving the group member list when monitoring group members entering and leaving.
# 5.0.1+3
* Optimize UI refresh timing when joining a call midway.

View File

@ -25,12 +25,12 @@ import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
enum UpdateType { groupInfo, memberList, joinApplicationList, groupDismissed, kickedFromGroup }
enum UpdateType { groupInfo, memberEnter, memberLeave, joinApplicationList, groupDismissed, kickedFromGroup }
class NeedUpdate {
final String groupID;
final UpdateType updateType;
final String extraData;
final dynamic extraData;
int? groupInfoSubType;
String? ownerID;
@ -55,7 +55,7 @@ class TUIGroupListenerModel extends ChangeNotifier {
TUIGroupListenerModel() {
_groupListener = V2TimGroupListener(onMemberInvited: (groupID, opUser, memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
_needUpdate = NeedUpdate(groupID, UpdateType.memberEnter, memberList);
notifyListeners();
}, onMemberKicked: (groupID, opUser, memberList) async {
if (_isLoginUserKickedFromGroup(groupID, memberList)) {
@ -66,10 +66,10 @@ class TUIGroupListenerModel extends ChangeNotifier {
notifyListeners();
}
}, onMemberEnter: (String groupID, List<V2TimGroupMemberInfo> memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
_needUpdate = NeedUpdate(groupID, UpdateType.memberEnter, memberList);
notifyListeners();
}, onMemberLeave: (String groupID, V2TimGroupMemberInfo member) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
_needUpdate = NeedUpdate(groupID, UpdateType.memberLeave, [member]);
notifyListeners();
}, onGroupInfoChanged: (groupID, changeInfos) {
_needUpdate = NeedUpdate(groupID, UpdateType.groupInfo, "");

View File

@ -24,6 +24,8 @@ import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
@ -585,6 +587,34 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
}
}
void processGroupMemberListEnter({required String groupID, required List<V2TimGroupMemberInfo> memberList}) async {
final List<V2TimGroupMemberFullInfo> fullInfoList = memberList
.where((member) => member.userID != null)
.map((member) {
return V2TimGroupMemberFullInfo(
userID: member.userID!,
nickName: member.nickName,
nameCard: member.nameCard,
friendRemark: member.friendRemark,
faceUrl: member.faceUrl,
onlineDevices: member.onlineDevices,
);
}).toList();
for (final fullInfo in fullInfoList) {
final exists = groupMemberList?.any((e) => e?.userID == fullInfo.userID) ?? false;
if (!exists) {
groupMemberList = [...?groupMemberList, fullInfo];
}
}
}
void processGroupMemberListLeave({required String groupID, required List<V2TimGroupMemberInfo> memberList}) async {
final Set<String?> userIDsToRemove = memberList.map((member) => member.userID).toSet();
groupMemberList?.removeWhere((member) => userIDsToRemove.contains(member?.userID));
}
void _notify() {
try {
notifyListeners();

View File

@ -16,6 +16,8 @@ import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart'
@ -134,6 +136,34 @@ class TUIGroupProfileModel extends ChangeNotifier {
return groupMemberListRes?.nextSeq;
}
Future<void> processGroupMemberListEnter({required String groupID, required List<V2TimGroupMemberInfo> memberList}) async {
final List<V2TimGroupMemberFullInfo> fullInfoList = memberList
.where((member) => member.userID != null)
.map((member) {
return V2TimGroupMemberFullInfo(
userID: member.userID!,
nickName: member.nickName,
nameCard: member.nameCard,
friendRemark: member.friendRemark,
faceUrl: member.faceUrl,
onlineDevices: member.onlineDevices,
);
}).toList();
for (final fullInfo in fullInfoList) {
final exists = _groupMemberList?.any((e) => e?.userID == fullInfo.userID) ?? false;
if (!exists) {
_groupMemberList = [...?_groupMemberList, fullInfo];
}
}
}
Future<void> processGroupMemberListLeave({required String groupID, required List<V2TimGroupMemberInfo> memberList}) async {
final Set<String?> userIDsToRemove = memberList.map((member) => member.userID).toSet();
_groupMemberList?.removeWhere((member) => userIDsToRemove.contains(member?.userID));
}
_loadConversation() async {
conversation = await _conversationService.getConversation(conversationID: "group_$_groupID");
}

View File

@ -449,11 +449,11 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
case UpdateType.groupInfo:
model.loadGroupInfo(_getConvID());
break;
case UpdateType.memberList:
if (widget.groupMemberList == null) {
model.loadGroupMemberList(groupID: _getConvID());
}
model.loadGroupInfo(_getConvID());
case UpdateType.memberEnter:
model.processGroupMemberListEnter(groupID: _getConvID(), memberList: needUpdate.extraData);
break;
case UpdateType.memberLeave:
model.processGroupMemberListLeave(groupID: _getConvID(), memberList: needUpdate.extraData);
break;
default:
break;

View File

@ -149,7 +149,8 @@ class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
case UpdateType.groupInfo:
Provider.of<TUIFriendShipViewModel>(context).loadGroupListData();
break;
case UpdateType.memberList:
case UpdateType.memberEnter:
case UpdateType.memberLeave:
Provider.of<TUIFriendShipViewModel>(context).loadGroupListData();
break;
default:

View File

@ -166,8 +166,12 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
model.loadGroupInfo(widget.groupID);
break;
case UpdateType.memberList:
model.loadGroupMemberList(groupID: widget.groupID);
case UpdateType.memberEnter:
model.processGroupMemberListEnter(groupID: widget.groupID, memberList: needUpdate.extraData);
model.loadGroupInfo(widget.groupID);
break;
case UpdateType.memberLeave:
model.processGroupMemberListLeave(groupID: widget.groupID, memberList: needUpdate.extraData);
model.loadGroupInfo(widget.groupID);
break;
default:

View File

@ -1,6 +1,6 @@
name: tencent_cloud_chat_uikit
description: A powerful chat UI component library and business logic for Tencent Cloud Chat, creating seamless in-app chat modules for delightful user experiences.
version: 5.0.1+3
version: 5.0.1+4
homepage: https://trtc.io/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn
repository: https://github.com/TencentCloud/chat-uikit-flutter
documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html