From 5d389d225b24d5e2d738b40482806efa77bba2fd Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 26 Jun 2025 17:17:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(agent):=20=E6=B7=BB=E5=8A=A0=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=8F=91=E9=80=81=E6=8C=89=E9=92=AE=E6=98=BE=E7=A4=BA?= =?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 | 12 ++ lib/modules/agent/views/agent_view.dart | 138 ++++++++++-------- 2 files changed, 89 insertions(+), 61 deletions(-) diff --git a/lib/modules/agent/controllers/agent_controller.dart b/lib/modules/agent/controllers/agent_controller.dart index 79d3e64c3..b4e58d19d 100644 --- a/lib/modules/agent/controllers/agent_controller.dart +++ b/lib/modules/agent/controllers/agent_controller.dart @@ -68,6 +68,9 @@ class AgentController extends GetxController { final isImageInputActive = false.obs; // 是否处于图片输入模式 final selectedImagePath = Rx(null); // 当前选择的图片路径 + // 输入状态控制 - 用于动态显示发送按钮 + final hasTextInput = false.obs; // 是否有文本输入 + // 流事件订阅 StreamSubscription? _eventSubscription; @@ -107,6 +110,7 @@ class AgentController extends GetxController { _subscribeToEvents(); //订阅代理服务事件 _initMusicStatus(); //初始化音乐状态 _setupMediaSessionCallbacks(); //设置媒体会话回调 + _setupTextInputListener(); //设置文本输入监听器 } // 初始化音乐播放状态 @@ -178,6 +182,14 @@ class AgentController extends GetxController { } } + // 设置文本输入监听器 + void _setupTextInputListener() { + textController.addListener(() { + final text = textController.text.trim(); + hasTextInput.value = text.isNotEmpty; + }); + } + // 加载聊天历史记录 Future _loadChatHistory() async { try { diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index fb1887ee5..5df5a3374 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -390,17 +390,6 @@ class AgentView extends StatelessWidget { ); }), ), - GestureDetector( - onTap: () => controller.sendMessage(), - child: Container( - padding: const EdgeInsets.all(6), - child: Icon( - Icons.send, - color: primaryColor, - size: 22, - ), - ), - ), ], ), ); @@ -482,60 +471,87 @@ class AgentView extends StatelessWidget { const SizedBox(width: 8), - // 图片选择按钮 - Container( - width: 44, - height: 44, - decoration: BoxDecoration( - color: isDarkMode ? Colors.grey[800] : Colors.grey[200], - borderRadius: BorderRadius.circular(22), - ), - child: PopupMenuButton( - icon: Icon( - Icons.add_photo_alternate_outlined, - color: - isDarkMode ? Colors.grey[300] : Colors.grey[700], - size: 22, - ), - padding: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - onSelected: (value) async { - if (value == 'camera') { - await controller.takePhoto(); - } else if (value == 'gallery') { - await controller.pickImage(); - } - }, - itemBuilder: (context) => [ - PopupMenuItem( - value: 'camera', - child: Row( - children: [ - Icon(Icons.camera_alt, - color: primaryColor, size: 20), - const SizedBox(width: 8), - const Text('拍照', - style: TextStyle(fontSize: 14)), - ], + // 动态按钮:图片选择按钮 或 发送按钮 + Obx(() { + final hasText = controller.hasTextInput.value; + final hasImage = controller.isImageInputActive.value; + final shouldShowSend = hasText || hasImage; + + if (shouldShowSend) { + // 显示发送按钮 + return GestureDetector( + onTap: () => controller.sendMessage(), + child: Container( + width: 44, + height: 44, + decoration: BoxDecoration( + color: primaryColor, + borderRadius: BorderRadius.circular(22), + ), + child: const Icon( + Icons.send, + color: Colors.white, + size: 22, ), ), - PopupMenuItem( - value: 'gallery', - child: Row( - children: [ - Icon(Icons.photo_library, - color: primaryColor, size: 20), - const SizedBox(width: 8), - const Text('从相册选择', - style: TextStyle(fontSize: 14)), - ], + ); + } else { + // 显示图片选择按钮 + return Container( + width: 44, + height: 44, + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[800] : Colors.grey[200], + borderRadius: BorderRadius.circular(22), + ), + child: PopupMenuButton( + icon: Icon( + Icons.add_photo_alternate_outlined, + color: + isDarkMode ? Colors.grey[300] : Colors.grey[700], + size: 22, ), + padding: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + onSelected: (value) async { + if (value == 'camera') { + await controller.takePhoto(); + } else if (value == 'gallery') { + await controller.pickImage(); + } + }, + itemBuilder: (context) => [ + PopupMenuItem( + value: 'camera', + child: Row( + children: [ + Icon(Icons.camera_alt, + color: primaryColor, size: 20), + const SizedBox(width: 8), + const Text('拍照', + style: TextStyle(fontSize: 14)), + ], + ), + ), + PopupMenuItem( + value: 'gallery', + child: Row( + children: [ + Icon(Icons.photo_library, + color: primaryColor, size: 20), + const SizedBox(width: 8), + const Text('从相册选择', + style: TextStyle(fontSize: 14)), + ], + ), + ), + ], ), - ], - ), - ), + ); + } + }), ], ), ],