Optimize the logic for retrieving the group member list when monitoring group members entering and leaving.
This commit is contained in:
parent
214558c7f4
commit
25a7c0e990
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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, "");
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue