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

Loading…
Cancel
Save