From cbb39ca2e86be01a28072aa973bf938b2e702489 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 12 Jan 2026 13:15:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89@=E6=88=90=E5=91=98=E9=80=89=E6=8B=A9=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=9B=9E=E8=B0=83=20atMemberPageBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tim_uikit_text_field.dart | 38 +++++++++++++------ .../TIMUIKitChat/tim_uikit_chat_config.dart | 20 +++++++++- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart index 3817283..89bc505 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart @@ -683,17 +683,33 @@ class _InputTextFieldState extends TIMUIKitState { isAddingAtSearchWords = false; } } else if (textLength > 0 && text[textLength - 1] == "@" && lastText.length < textLength) { - List? selectedAtMemberList = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AtText( - groupMemberList: model.groupMemberList, - groupInfo: model.groupInfo, - groupID: groupID, - canAtAll: canAtAll, - groupType: widget.groupType), - ), - ); + List? selectedAtMemberList; + + // 使用自定义 atMemberPageBuilder 如果提供 + final atBuilder = widget.chatConfig?.atMemberPageBuilder; + if (atBuilder != null) { + selectedAtMemberList = await atBuilder( + context, + model.groupMemberList, + model.groupInfo, + groupID, + canAtAll, + widget.groupType, + ); + } else { + // 使用默认的 AtText 页面 + selectedAtMemberList = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AtText( + groupMemberList: model.groupMemberList, + groupInfo: model.groupInfo, + groupID: groupID, + canAtAll: canAtAll, + groupType: widget.groupType), + ), + ); + } if (selectedAtMemberList == null) return; for (int i = 0; i < selectedAtMemberList.length; ++i) { diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart index 8e47ce9..f306d8a 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart @@ -1,4 +1,9 @@ +import 'package:flutter/material.dart'; import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart'; +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_message.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; @@ -256,6 +261,18 @@ class TIMUIKitChatConfig { /// [Default]: false final bool isMemberCanAtAll; + /// Builder for custom @ member selection page. + /// If provided, will use this instead of the default AtText page. + /// Return null to cancel the @ operation. + final Future?> Function( + BuildContext context, + List? groupMemberList, + V2TimGroupInfo? groupInfo, + String? groupID, + bool canAtAll, + String? groupType, + )? atMemberPageBuilder; + const TIMUIKitChatConfig( {this.onTapLink, this.timeDividerConfig, @@ -302,5 +319,6 @@ class TIMUIKitChatConfig { this.showC2cMessageEditStatus = true, this.additionalDesktopControlBarItems, this.isAllowLongPressAvatarToAt = true, - this.isMemberCanAtAll = false}); + this.isMemberCanAtAll = false, + this.atMemberPageBuilder}); }