Browse Source

feat(agent_view): 添加聊天区域点击收起键盘功能并优化焦点控制

- 新增 FocusNode 用于控制 TextField 焦点
- 点击聊天区域时收起键盘并收起扩展选项
- 切换输入模式时自动管理焦点状态
weicu
lxm 1 year ago
parent
commit
dbc1602f96
  1. 50
      lib/modules/agent/views/agent_view.dart

50
lib/modules/agent/views/agent_view.dart

@ -25,6 +25,9 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
late MessageActionController messageActionController; late MessageActionController messageActionController;
double _keyboardHeight = 0; double _keyboardHeight = 0;
// 👇 新增:用于控制 TextField 焦点
final FocusNode _textFocusNode = FocusNode();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -35,6 +38,7 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
@override @override
void dispose() { void dispose() {
_textFocusNode.dispose();
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
super.dispose(); super.dispose();
} }
@ -286,6 +290,14 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
children: [ children: [
// 聊天内容 // 聊天内容
Expanded( Expanded(
child: GestureDetector(
onTap: () {
// 点击聊天区域时,收起键盘并切换工具显示状态
FocusScope.of(context).unfocus();
if (controller.isPlusOptionsExpanded.value) {
controller.collapsePlusOptions();
}
},
child: Obx(() { child: Obx(() {
return Align( return Align(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
@ -316,25 +328,29 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
return IntroOverlayBuilder.aiBuilder( return IntroOverlayBuilder.aiBuilder(
params, params,
controller.noviceGuideService.aiStepsList[ controller.noviceGuideService.aiStepsList[
controller controller.noviceGuideService
.noviceGuideService.aiStep]['end'], .aiStep]['end'],
onFinish: () async { onFinish: () async {
if (controller.noviceGuideService.aiStep < if (controller
.noviceGuideService.aiStep <
5) { 5) {
await Future.delayed( await Future.delayed(const Duration(
const Duration(milliseconds: 300)); milliseconds: 300));
controller.noviceGuideService.aiStep++; controller
.noviceGuideService.aiStep++;
Intro.of(Get.context!) Intro.of(Get.context!)
.start(group: 'ai', reset: true); .start(group: 'ai', reset: true);
} }
}, },
onTap: () async { onTap: () async {
params.onFinish(); params.onFinish();
if (controller.noviceGuideService.aiStep < if (controller
.noviceGuideService.aiStep <
5) { 5) {
await Future.delayed( await Future.delayed(const Duration(
const Duration(milliseconds: 300)); milliseconds: 300));
controller.noviceGuideService.aiStep++; controller
.noviceGuideService.aiStep++;
Intro.of(Get.context!) Intro.of(Get.context!)
.start(group: 'ai', reset: true); .start(group: 'ai', reset: true);
} }
@ -374,8 +390,9 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
child: GestureDetector( child: GestureDetector(
onLongPressStart: onLongPressStart:
(LongPressStartDetails details) { (LongPressStartDetails details) {
messageActionController.onLongPressMessage( messageActionController
context, isDarkMode, details, message); .onLongPressMessage(context,
isDarkMode, details, message);
}, },
child: MessageBubble( child: MessageBubble(
sessionid: message.sessionid, sessionid: message.sessionid,
@ -397,6 +414,7 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
); );
}), }),
), ),
),
// 输入区域 // 输入区域
Container( Container(
@ -553,6 +571,13 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
controller.toggleInputMode(); controller.toggleInputMode();
// 切换模式时,确保焦点正确
if (!isTextMode) {
// 切换到语音模式时,请求焦点
Future.delayed(Duration.zero, () {
_textFocusNode.requestFocus();
});
}
}, },
child: Container( child: Container(
width: 44.w, width: 44.w,
@ -652,6 +677,7 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
controller.isImageInputActive.value; controller.isImageInputActive.value;
return TextField( return TextField(
focusNode: _textFocusNode, // 绑定焦点节点
controller: controller.textController, controller: controller.textController,
maxLines: isImageActive maxLines: isImageActive
? 3 ? 3

Loading…
Cancel
Save