Browse Source

修改ai助手引导页

newdev_shunjiawei
tanlongsheng 1 year ago
parent
commit
3ee6ff6563
  1. 71
      lib/core/widgets/intro_overlay_builder.dart
  2. 15
      lib/core/widgets/select_location_map.dart
  3. 43
      lib/data/services/novice_guide_service.dart
  4. 117
      lib/modules/agent/views/agent_view.dart

71
lib/core/widgets/intro_overlay_builder.dart

@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:flutter_intro/flutter_intro.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class IntroOverlayBuilder {
static Widget aiBuilder(
StepWidgetParams params,
String text, {
bool alignment = true,
Function? onNext,
Function? onFinish,
}) {
return Column(
crossAxisAlignment:
alignment ? CrossAxisAlignment.start : CrossAxisAlignment.end,
children: [
Padding(
padding: EdgeInsets.only(bottom: 10.w),
child: Text(
text,
style: TextStyle(
fontSize: 15.sp,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
Row(
children: [
if (onNext != null)
_button(
'确定输入',
() {
params.onNext!();
onNext();
},
),
if (onFinish != null)
_button(
'下一步',
() {
params.onFinish();
onFinish();
},
),
],
),
],
);
}
static Widget _button(String text, Function() onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20.r),
border: Border.all(color: Colors.white),
),
child: Text(
text,
style: TextStyle(
fontSize: 14.sp,
color: Colors.white,
),
),
),
);
}
}

15
lib/core/widgets/select_location_map.dart

@ -1,15 +0,0 @@
import 'package:flutter/material.dart';
class SelectLocationMap extends StatefulWidget {
const SelectLocationMap({super.key});
@override
State<SelectLocationMap> createState() => _SelectLocationMapState();
}
class _SelectLocationMapState extends State<SelectLocationMap> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

43
lib/data/services/novice_guide_service.dart

@ -6,7 +6,48 @@ class NoviceGuideService extends GetxService {
final GetStorage _storage = GetStorage(); final GetStorage _storage = GetStorage();
bool isHomeGuide = true; bool isHomeGuide = true;
bool isAIGuide = true; bool isAIGuide = false;
int aiStep = 0;
List aiStepsList = [
{
'start': '对小言说:“今天天气怎么样”',
'input': '今天天气怎么样',
'send': '小言会为你实时为你播报天气',
'end': '小言能实时为你播报天气,试试其他指令吧',
},
{
'start': '对小言说:“请播放一组摇滚乐”',
'input': '请播放一组摇滚乐',
'send': '小言会为你搜寻到一组音乐',
'end': '小言已成功为您搜寻到一组音乐,试试其他指令吧',
},
{
'start': '对小言说:“导航到深圳机场”',
'input': '导航到深圳机场',
'send': '小言会为你规划路线',
'end': '小言已成功为您导航到深圳机场,试试其他指令吧',
},
{
'start': '对小言说:“明天下午3点创建会议提醒”',
'input': '明天下午3点创建会议提醒',
'send': '小言会为你创建会议提醒',
'end': '小言已成功为您创建会议提醒,试试其他指令吧',
},
{
'start': '对小言说:“拨打妈妈的电话”',
'input': '拨打妈妈的电话',
'send': '小言会为你拨打电话',
'end': '小言已成功为您拨打电话,试试其他指令吧',
},
{
'start': '对小言说:“给爸爸发短信说晚上回家吃饭’”',
'input': '给爸爸发短信说晚上回家吃饭’',
'send': '小言会为你发送短信',
'end': '短信已发送,语音操控更便捷',
},
];
@override @override
void onInit() { void onInit() {

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

@ -4,6 +4,7 @@ import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_intro/flutter_intro.dart'; import 'package:flutter_intro/flutter_intro.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../core/widgets/intro_overlay_builder.dart';
import '../controllers/agent_controller.dart'; import '../controllers/agent_controller.dart';
import '../controllers/message_action_controller.dart'; import '../controllers/message_action_controller.dart';
import 'message_bubble.dart'; import 'message_bubble.dart';
@ -197,7 +198,37 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
children: [ children: [
// 聊天内容 // 聊天内容
Expanded( Expanded(
child: Obx( child: Stack(
children: [
IntroStepBuilder(
group: 'ai',
order: 3,
overlayBuilder: (params) {
return IntroOverlayBuilder.aiBuilder(
params,
controller.noviceGuideService.aiStepsList[
controller.noviceGuideService.aiStep]['end'],
onFinish: () async {
if (controller.noviceGuideService.aiStep < 5) {
await Future.delayed(
const Duration(milliseconds: 300));
controller.noviceGuideService.aiStep++;
Intro.of(Get.context!)
.start(group: 'ai', reset: true);
}
},
);
},
builder: (BuildContext context, GlobalKey key) => Align(
alignment: Alignment.bottomCenter,
child: SizedBox(
key: key,
width: double.infinity,
height: 430.w,
),
),
),
Obx(
() => Align( () => Align(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
child: ListView.builder( child: ListView.builder(
@ -215,8 +246,8 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
return _buildLoadMoreIndicator(); return _buildLoadMoreIndicator();
} }
final message = controller final message = controller.messages[
.messages[controller.messages.length - 1 - index]; controller.messages.length - 1 - index];
return Padding( return Padding(
padding: EdgeInsets.only(bottom: 8.h), padding: EdgeInsets.only(bottom: 8.h),
child: GestureDetector( child: GestureDetector(
@ -239,6 +270,8 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
), ),
), ),
), ),
],
),
), ),
// 输入区域 // 输入区域
@ -392,7 +425,23 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
return IntroStepBuilder( return IntroStepBuilder(
group: 'ai', group: 'ai',
order: 1, order: 1,
text: '对小言说“今天天气怎么样”', overlayBuilder: (params) {
return IntroOverlayBuilder.aiBuilder(
params,
controller.noviceGuideService
.aiStepsList[
controller.noviceGuideService
.aiStep]['start'],
onNext: () {
controller.textController.text =
controller.noviceGuideService
.aiStepsList[
controller
.noviceGuideService
.aiStep]['input'];
},
);
},
onWidgetLoad: () { onWidgetLoad: () {
controller.noviceGuideService controller.noviceGuideService
.startAIGuide(); .startAIGuide();
@ -630,13 +679,36 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
SizedBox(width: 8.w), SizedBox(width: 8.w),
// 动态按钮区域:展开按钮 + 发送按钮 或 图片选择按钮 // 动态按钮区域:展开按钮 + 发送按钮 或 图片选择按钮
Obx(() { Builder(builder: (context) {
final hasText = controller.hasTextInput.value; StepWidgetParams? widgetParams;
return IntroStepBuilder(
group: 'ai',
order: 2,
onHighlightWidgetTap: () {
widgetParams!.onNext!();
controller.sendMessage();
},
overlayBuilder: (params) {
widgetParams = params;
return IntroOverlayBuilder.aiBuilder(
params,
'点击发送,${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['send']}',
alignment: false,
);
},
builder:
(BuildContext context, GlobalKey key) =>
Obx(
key: key,
() {
final hasText =
controller.hasTextInput.value;
final hasImage = final hasImage =
controller.isImageInputActive.value; controller.isImageInputActive.value;
final shouldShowSend = hasText || hasImage; final shouldShowSend =
final shouldShowExpand = hasText || hasImage;
controller.shouldShowExpandButton.value; final shouldShowExpand = controller
.shouldShowExpandButton.value;
if (shouldShowSend) { if (shouldShowSend) {
// 显示发送按钮(可能还有展开按钮) // 显示发送按钮(可能还有展开按钮)
@ -646,12 +718,13 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
// 展开按钮(在发送按钮上方) // 展开按钮(在发送按钮上方)
if (shouldShowExpand && hasText) if (shouldShowExpand && hasText)
Padding( Padding(
padding: padding: EdgeInsets.only(
EdgeInsets.only(bottom: 40.h), bottom: 40.h),
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
// 打开底部弹出编辑模式 // 打开底部弹出编辑模式
controller.openFullScreenEdit(); controller
.openFullScreenEdit();
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
@ -673,7 +746,8 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
? Colors.grey[700] ? Colors.grey[700]
: Colors.grey[300], : Colors.grey[300],
borderRadius: borderRadius:
BorderRadius.circular(16.w), BorderRadius.circular(
16.w),
), ),
child: Icon( child: Icon(
Icons.expand_less, Icons.expand_less,
@ -687,14 +761,16 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
), ),
// 发送按钮 // 发送按钮
GestureDetector( GestureDetector(
onTap: () => controller.sendMessage(), onTap: () =>
controller.sendMessage(),
child: Container( child: Container(
width: 44.w, width: 44.w,
height: 44.w, height: 44.w,
decoration: BoxDecoration( decoration: BoxDecoration(
color: primaryColor, color: primaryColor,
borderRadius: borderRadius:
BorderRadius.circular(22.w), BorderRadius.circular(
22.w),
), ),
child: Icon( child: Icon(
Icons.send, Icons.send,
@ -708,8 +784,8 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
} else { } else {
// 显示'+'选择按钮 // 显示'+'选择按钮
return Obx(() { return Obx(() {
final isExpanded = final isExpanded = controller
controller.isPlusOptionsExpanded.value; .isPlusOptionsExpanded.value;
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
controller.togglePlusOptions(); controller.togglePlusOptions();
@ -725,7 +801,9 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
BorderRadius.circular(22.w), BorderRadius.circular(22.w),
), ),
child: Icon( child: Icon(
isExpanded ? Icons.close : Icons.add, isExpanded
? Icons.close
: Icons.add,
color: isDarkMode color: isDarkMode
? Colors.grey[300] ? Colors.grey[300]
: Colors.grey[700], : Colors.grey[700],
@ -735,6 +813,9 @@ class _AgentViewState extends State<AgentView> with WidgetsBindingObserver {
); );
}); });
} }
},
),
);
}), }),
], ],
), ),

Loading…
Cancel
Save