From 7ac4ad7e3790b07f00a4aaf9f283f349b899eabe Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 27 Jun 2025 21:12:05 +0800 Subject: [PATCH] =?UTF-8?q?refactor(agent):=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=80=89=E9=A1=B9=E4=B8=BA=E5=8A=A0=E5=8F=B7?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E5=B9=B6=E6=94=B9=E8=BF=9B=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构图片选择选项为加号选项,使其功能更通用。改进展开逻辑,添加键盘关闭检测机制和待展开状态标记,提升用户体验。 --- .../agent/controllers/agent_controller.dart | 93 +++++++++++++------ lib/modules/agent/views/agent_view.dart | 20 ++-- 2 files changed, 76 insertions(+), 37 deletions(-) diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 3648b0639..7de28787d 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -75,8 +75,8 @@ class AgentController extends GetxController { final isFullScreenEditMode = false.obs; // 是否处于全屏编辑模式 final shouldShowExpandButton = false.obs; // 是否显示展开按钮 - // 图片选择选项展开状态 - final isImageOptionsExpanded = false.obs; // 是否展开图片选择选项 + // "+"号选项展开状态 + final isPlusOptionsExpanded = false.obs; // 是否展开"+"号选项 // 键盘状态 final isKeyboardVisible = false.obs; // 键盘是否可见 @@ -904,39 +904,65 @@ class AgentController extends GetxController { isImageInputActive.value = false; } - // 切换图片选项展开状态 - void toggleImageOptions() { - if (isImageOptionsExpanded.value) { + // 切换'+'选项展开状态 + void togglePlusOptions() { + if (isPlusOptionsExpanded.value) { // 如果当前已展开,则收缩 - collapseImageOptions(); + collapsePlusOptions(); + _pendingPlusOptionsExpansion = false; // 取消待展开状态 } else { // 如果当前未展开,则展开并关闭键盘 if (isKeyboardVisible.value) { + // 设置待展开标记 + _pendingPlusOptionsExpansion = true; hideKeyboard(); - // 延迟展开选项,等待键盘完全关闭 - Future.delayed(const Duration(milliseconds: 200), () { - // 再次检查键盘状态,确保键盘已关闭 - if (!isKeyboardVisible.value) { - isImageOptionsExpanded.value = true; - } else { - // 如果键盘还没关闭,再等一会儿 - Future.delayed(const Duration(milliseconds: 100), () { - if (!isKeyboardVisible.value) { - isImageOptionsExpanded.value = true; - } - }); - } - }); + // 使用双重机制:轮询检测 + 键盘状态监听 + _waitForKeyboardToClose(); } else { // 键盘未显示,直接展开 - isImageOptionsExpanded.value = true; + isPlusOptionsExpanded.value = true; } } } - // 收缩图片选项 - void collapseImageOptions() { - isImageOptionsExpanded.value = false; + // 等待键盘关闭的轮询机制 + void _waitForKeyboardToClose() { + int attempts = 0; + const maxAttempts = 30; // 最多尝试30次,总计3秒 + const checkInterval = Duration(milliseconds: 100); // 每100ms检查一次 + + Timer.periodic(checkInterval, (timer) { + attempts++; + + // 检查是否还需要展开(用户可能已经取消了) + if (!_pendingPlusOptionsExpansion) { + timer.cancel(); + return; + } + + if (!isKeyboardVisible.value) { + // 键盘已关闭,展开选项 + timer.cancel(); + _pendingPlusOptionsExpansion = false; + // 添加小延迟确保UI稳定 + Future.delayed(const Duration(milliseconds: 50), () { + if (!isKeyboardVisible.value) { // 再次确认键盘状态 + isPlusOptionsExpanded.value = true; + } + }); + } else if (attempts >= maxAttempts) { + // 超时,强制展开(可能键盘检测有问题) + timer.cancel(); + _pendingPlusOptionsExpansion = false; + Logger.d('AgentController', '键盘关闭检测超时,强制展开选项'); + isPlusOptionsExpanded.value = true; + } + }); + } + + // 收缩'+'选项 + void collapsePlusOptions() { + isPlusOptionsExpanded.value = false; } // 更新键盘可见状态 @@ -944,13 +970,26 @@ class AgentController extends GetxController { final wasVisible = isKeyboardVisible.value; isKeyboardVisible.value = isVisible; - // 只有当键盘从隐藏变为显示时,才收缩图片选项 + // 只有当键盘从隐藏变为显示时,才收缩'+'选项 // 避免键盘关闭时误触发收缩逻辑 - if (!wasVisible && isVisible && isImageOptionsExpanded.value) { - collapseImageOptions(); + if (!wasVisible && isVisible && isPlusOptionsExpanded.value) { + collapsePlusOptions(); + } + + // 如果键盘关闭了,并且有待展开的选项,则展开 + if (wasVisible && !isVisible && _pendingPlusOptionsExpansion) { + _pendingPlusOptionsExpansion = false; + Future.delayed(const Duration(milliseconds: 100), () { + if (!isKeyboardVisible.value) { + isPlusOptionsExpanded.value = true; + } + }); } } + // 标记是否有待展开的'+'选项 + bool _pendingPlusOptionsExpansion = false; + // 隐藏键盘 void hideKeyboard() { FocusManager.instance.primaryFocus?.unfocus(); diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index a1f8361a2..da6ba9952 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -407,12 +407,12 @@ class _AgentViewState extends State with WidgetsBindingObserver { textInputAction: TextInputAction .newline, // 支持回车换行 onTap: () { - // 当点击输入框时,如果图片选项已展开,则收缩 + // 当点击输入框时,如果'+'选项已展开,则收缩 if (controller - .isImageOptionsExpanded + .isPlusOptionsExpanded .value) { controller - .collapseImageOptions(); + .collapsePlusOptions(); } }, style: TextStyle( @@ -607,10 +607,10 @@ class _AgentViewState extends State with WidgetsBindingObserver { // 显示'+'选择按钮 return Obx(() { final isExpanded = - controller.isImageOptionsExpanded.value; + controller.isPlusOptionsExpanded.value; return GestureDetector( onTap: () { - controller.toggleImageOptions(); + controller.togglePlusOptions(); }, child: Container( width: 44, @@ -640,7 +640,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { // 展开的'+'选择选项 Obx(() { final isExpanded = - controller.isImageOptionsExpanded.value; + controller.isPlusOptionsExpanded.value; return AnimatedContainer( duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, @@ -658,7 +658,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { icon: Icons.camera_alt, label: '拍照', onTap: () async { - //controller.collapseImageOptions(); + //controller.collapsePlusOptions(); await controller.takePhoto(); }, isDarkMode: isDarkMode, @@ -669,7 +669,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { icon: Icons.photo_library, label: '相册', onTap: () async { - //controller.collapseImageOptions(); + //controller.collapsePlusOptions(); await controller.pickImage(); }, isDarkMode: isDarkMode, @@ -680,7 +680,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { // icon: Icons.folder, // label: '文件', // onTap: () { - // //controller.collapseImageOptions(); + // //controller.collapsePlusOptions(); // // TODO: 实现文件选择功能 // }, // isDarkMode: isDarkMode, @@ -691,7 +691,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { icon: Icons.phone, label: '打电话', onTap: () { - //controller.collapseImageOptions(); + //controller.collapsePlusOptions(); // TODO: 实现通话功能 }, isDarkMode: isDarkMode,