|
|
@ -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 |
|
|
|