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 # 5.0.1+3
* Optimize UI refresh timing when joining a call midway. * 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/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.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 { class NeedUpdate {
final String groupID; final String groupID;
final UpdateType updateType; final UpdateType updateType;
final String extraData; final dynamic extraData;
int? groupInfoSubType; int? groupInfoSubType;
String? ownerID; String? ownerID;
@ -55,7 +55,7 @@ class TUIGroupListenerModel extends ChangeNotifier {
TUIGroupListenerModel() { TUIGroupListenerModel() {
_groupListener = V2TimGroupListener(onMemberInvited: (groupID, opUser, memberList) { _groupListener = V2TimGroupListener(onMemberInvited: (groupID, opUser, memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, ""); _needUpdate = NeedUpdate(groupID, UpdateType.memberEnter, memberList);
notifyListeners(); notifyListeners();
}, onMemberKicked: (groupID, opUser, memberList) async { }, onMemberKicked: (groupID, opUser, memberList) async {
if (_isLoginUserKickedFromGroup(groupID, memberList)) { if (_isLoginUserKickedFromGroup(groupID, memberList)) {
@ -66,10 +66,10 @@ class TUIGroupListenerModel extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
}, onMemberEnter: (String groupID, List<V2TimGroupMemberInfo> memberList) { }, onMemberEnter: (String groupID, List<V2TimGroupMemberInfo> memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, ""); _needUpdate = NeedUpdate(groupID, UpdateType.memberEnter, memberList);
notifyListeners(); notifyListeners();
}, onMemberLeave: (String groupID, V2TimGroupMemberInfo member) { }, onMemberLeave: (String groupID, V2TimGroupMemberInfo member) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, ""); _needUpdate = NeedUpdate(groupID, UpdateType.memberLeave, [member]);
notifyListeners(); notifyListeners();
}, onGroupInfoChanged: (groupID, changeInfos) { }, onGroupInfoChanged: (groupID, changeInfos) {
_needUpdate = NeedUpdate(groupID, UpdateType.groupInfo, ""); _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'; 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' 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'; 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' 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'; 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' 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() { void _notify() {
try { try {
notifyListeners(); 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'; 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' 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'; 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' 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'; 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' 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; 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 { _loadConversation() async {
conversation = await _conversationService.getConversation(conversationID: "group_$_groupID"); conversation = await _conversationService.getConversation(conversationID: "group_$_groupID");
} }

View File

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

View File

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

View File

@ -166,8 +166,12 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
model.loadGroupInfo(widget.groupID); model.loadGroupInfo(widget.groupID);
break; break;
case UpdateType.memberList: case UpdateType.memberEnter:
model.loadGroupMemberList(groupID: widget.groupID); 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); model.loadGroupInfo(widget.groupID);
break; break;
default: default:

View File

@ -1,6 +1,6 @@
name: tencent_cloud_chat_uikit 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. 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 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 repository: https://github.com/TencentCloud/chat-uikit-flutter
documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html