diff --git a/lib/data/services/novice_guide_service.dart b/lib/data/services/novice_guide_service.dart index fb124a77a..485004914 100644 --- a/lib/data/services/novice_guide_service.dart +++ b/lib/data/services/novice_guide_service.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:ble_service/ble_service.dart'; import 'package:flutter_intro/flutter_intro.dart'; @@ -82,21 +83,23 @@ class NoviceGuideService extends GetxService { 'send': '小言会为你拨打电话', 'end': '小言已成功为您拨打电话,试试其他指令吧', 'method': () async { - // 拨打电话需要电话权限 - await PermissionUtil.instance.requestPermission( - permissionType: Permission.phone, - permissionName: 'phone'.tr, // 电话 - explanationText: 'phonePermissionDesc'.tr, // 用于拨打电话功能 - permanentDenialText: 'phonePermissionDetailDesc'.tr, // 拨打电话功能需要电话权限 - ); - //拨打电话还需要联系人权限 - await PermissionUtil.instance.requestPermission( - permissionType: Permission.contacts, - permissionName: 'contacts'.tr, // 联系人 - explanationText: 'contactsPermissionDesc'.tr, // 用于访问联系人信息 - permanentDenialText: - 'contactsPermissionDetailDesc'.tr, // 拨打电话功能需要联系人权限 - ); + if (Platform.isAndroid) { + // 拨打电话需要电话权限 + await PermissionUtil.instance.requestPermission( + permissionType: Permission.phone, + permissionName: 'phone'.tr, // 电话 + explanationText: 'phonePermissionDesc'.tr, // 用于拨打电话功能 + permanentDenialText: 'phonePermissionDetailDesc'.tr, // 拨打电话功能需要电话权限 + ); + //拨打电话还需要联系人权限 + await PermissionUtil.instance.requestPermission( + permissionType: Permission.contacts, + permissionName: 'contacts'.tr, // 联系人 + explanationText: 'contactsPermissionDesc'.tr, // 用于访问联系人信息 + permanentDenialText: + 'contactsPermissionDetailDesc'.tr, // 拨打电话功能需要联系人权限 + ); + } }, }, { @@ -105,21 +108,23 @@ class NoviceGuideService extends GetxService { 'send': '小言会为你发送短信', 'end': '短信已发送,语音操控更便捷', 'method': () async { - // 发送短信需要短信权限 - await PermissionUtil.instance.requestPermission( - permissionType: Permission.sms, - permissionName: 'sms'.tr, // 短信 - explanationText: 'smsPermissionDesc'.tr, // 用于发送短信功能 - permanentDenialText: 'smsPermissionDetailDesc'.tr, // 发送短信功能需要短信权限 - ); - //发送短信还需要联系人权限 - await PermissionUtil.instance.requestPermission( - permissionType: Permission.contacts, - permissionName: 'contacts'.tr, // 联系人 - explanationText: 'contactsPermissionDesc'.tr, // 用于访问联系人信息 - permanentDenialText: - 'contactsPermissionDetailDesc'.tr, // 发送短信功能需要联系人权限 - ); + if (Platform.isAndroid) { + // 发送短信需要短信权限 + await PermissionUtil.instance.requestPermission( + permissionType: Permission.sms, + permissionName: 'sms'.tr, // 短信 + explanationText: 'smsPermissionDesc'.tr, // 用于发送短信功能 + permanentDenialText: 'smsPermissionDetailDesc'.tr, // 发送短信功能需要短信权限 + ); + //发送短信还需要联系人权限 + await PermissionUtil.instance.requestPermission( + permissionType: Permission.contacts, + permissionName: 'contacts'.tr, // 联系人 + explanationText: 'contactsPermissionDesc'.tr, // 用于访问联系人信息 + permanentDenialText: + 'contactsPermissionDetailDesc'.tr, // 发送短信功能需要联系人权限 + ); + } }, }, ]; diff --git a/lib/modules/agent/views/agent_view.dart b/lib/modules/agent/views/agent_view.dart index 22fc128f0..7ed4c0ddd 100644 --- a/lib/modules/agent/views/agent_view.dart +++ b/lib/modules/agent/views/agent_view.dart @@ -196,17 +196,7 @@ class _AgentViewState extends State with WidgetsBindingObserver { IntroStepBuilder( group: 'ai', order: 3, - getOverlayPosition: ({ - required Offset offset, - required Size screenSize, - required Size size, - }) { - return OverlayPosition( - top: 200.h, - width: screenSize.width, - crossAxisAlignment: CrossAxisAlignment.end, - ); - }, + getOverlayPosition: IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { return Obx( () => IntroOverlayBuilder.homeBuilder( @@ -252,6 +242,8 @@ class _AgentViewState extends State with WidgetsBindingObserver { ? IntroStepBuilder( group: 'ai', order: 4, + getOverlayPosition: + IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, @@ -511,6 +503,8 @@ class _AgentViewState extends State with WidgetsBindingObserver { return IntroStepBuilder( group: 'ai', order: 1, + getOverlayPosition: + IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, @@ -756,149 +750,143 @@ class _AgentViewState extends State with WidgetsBindingObserver { SizedBox(width: 8.w), // 动态按钮区域:展开按钮 + 发送按钮 或 图片选择按钮 - Builder(builder: (context) { - StepWidgetParams? widgetParams; - return IntroStepBuilder( - group: 'ai', - order: 2, - onHighlightWidgetTap: () async { - await controller - .noviceGuideService.aiStepsList[ - controller.noviceGuideService.aiStep] - ['method'](); - 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 = - controller.isImageInputActive.value; - final shouldShowSend = hasText || hasImage; - final shouldShowExpand = - controller.shouldShowExpandButton.value; + IntroStepBuilder( + group: 'ai', + order: 2, + getOverlayPosition: + IntroOverlayBuilder.overlayPosition, + overlayBuilder: (params) { + return IntroOverlayBuilder.aiBuilder( + params, + '点击发送,${controller.noviceGuideService.aiStepsList[controller.noviceGuideService.aiStep]['send']}', + alignment: false, + onTap: () async { + await controller + .noviceGuideService.aiStepsList[ + controller.noviceGuideService + .aiStep]['method'](); + params.onNext!(); + controller.sendMessage(); + }, + ); + }, + builder: (BuildContext context, GlobalKey key) => + Obx( + key: key, + () { + final hasText = controller.hasTextInput.value; + final hasImage = + controller.isImageInputActive.value; + final shouldShowSend = hasText || hasImage; + final shouldShowExpand = + controller.shouldShowExpandButton.value; - if (shouldShowSend) { - // 显示发送按钮(可能还有展开按钮) - return Column( - children: [ - // 展开按钮(在发送按钮上方) - if (shouldShowExpand && hasText) - Padding( - padding: - EdgeInsets.only(bottom: 40.h), - child: GestureDetector( - onTap: () { - // 打开底部弹出编辑模式 + if (shouldShowSend) { + // 显示发送按钮(可能还有展开按钮) + return Column( + children: [ + // 展开按钮(在发送按钮上方) + if (shouldShowExpand && hasText) + Padding( + padding: + EdgeInsets.only(bottom: 40.h), + child: GestureDetector( + onTap: () { + // 打开底部弹出编辑模式 + controller.openFullScreenEdit(); + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: + Colors.transparent, + builder: (context) => + const FullScreenEditor(), + ).then((_) { + // 弹出页关闭时的回调 controller - .openFullScreenEdit(); - showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: - Colors.transparent, - builder: (context) => - const FullScreenEditor(), - ).then((_) { - // 弹出页关闭时的回调 - controller - .closeFullScreenEdit(); - }); - }, - child: Container( - width: 32.w, - height: 32.w, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.grey[700] - : Colors.grey[300], - borderRadius: - BorderRadius.circular( - 16.w), - ), - child: Icon( - Icons.expand_less, - color: isDarkMode - ? Colors.grey[300] - : Colors.grey[700], - size: 20.sp, - ), + .closeFullScreenEdit(); + }); + }, + child: Container( + width: 32.w, + height: 32.w, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.grey[700] + : Colors.grey[300], + borderRadius: + BorderRadius.circular( + 16.w), + ), + child: Icon( + Icons.expand_less, + color: isDarkMode + ? Colors.grey[300] + : Colors.grey[700], + size: 20.sp, ), - ), - ), - // 发送按钮 - GestureDetector( - onTap: () => - controller.sendMessage(), - child: Container( - width: 44.w, - height: 44.w, - margin: EdgeInsets.symmetric( - vertical: 2.w), - decoration: BoxDecoration( - color: primaryColor, - borderRadius: - BorderRadius.circular(22.w), - ), - child: Icon( - Icons.send, - color: Colors.white, - size: 22.sp, ), ), ), - ], - ); - } else { - // 显示'+'选择按钮 - return Obx(() { - final isExpanded = controller - .isPlusOptionsExpanded.value; - return GestureDetector( - onTap: () { - controller.togglePlusOptions(); - }, + // 发送按钮 + GestureDetector( + onTap: () => controller.sendMessage(), child: Container( width: 44.w, height: 44.w, margin: EdgeInsets.symmetric( vertical: 2.w), decoration: BoxDecoration( - color: isDarkMode - ? Colors.grey[800] - : Colors.grey[200], + color: primaryColor, borderRadius: BorderRadius.circular(22.w), ), child: Icon( - isExpanded - ? Icons.close - : Icons.add, - color: isDarkMode - ? Colors.grey[300] - : Colors.grey[700], + Icons.send, + color: Colors.white, size: 22.sp, ), ), - ); - }); - } - }, - ), - ); - }), + ), + ], + ); + } else { + // 显示'+'选择按钮 + return Obx(() { + final isExpanded = controller + .isPlusOptionsExpanded.value; + return GestureDetector( + onTap: () { + controller.togglePlusOptions(); + }, + child: Container( + width: 44.w, + height: 44.w, + margin: EdgeInsets.symmetric( + vertical: 2.w), + decoration: BoxDecoration( + color: isDarkMode + ? Colors.grey[800] + : Colors.grey[200], + borderRadius: + BorderRadius.circular(22.w), + ), + child: Icon( + isExpanded + ? Icons.close + : Icons.add, + color: isDarkMode + ? Colors.grey[300] + : Colors.grey[700], + size: 22.sp, + ), + ), + ); + }); + } + }, + ), + ), ], ), diff --git a/lib/modules/home/views/home_view.dart b/lib/modules/home/views/home_view.dart index e51be533d..d24e726fb 100644 --- a/lib/modules/home/views/home_view.dart +++ b/lib/modules/home/views/home_view.dart @@ -96,6 +96,7 @@ class HomeView extends GetView { onWidgetLoad: () { controller.noviceGuideService.startHomeGuide(); }, + getOverlayPosition: IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, @@ -116,17 +117,7 @@ class HomeView extends GetView { IntroStepBuilder( group: 'home', order: 2, - getOverlayPosition: ({ - required Offset offset, - required Size screenSize, - required Size size, - }) { - return OverlayPosition( - top: 200.h, - width: screenSize.width, - crossAxisAlignment: CrossAxisAlignment.end, - ); - }, + getOverlayPosition: IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { return Obx( () => IntroOverlayBuilder.homeBuilder( @@ -730,14 +721,15 @@ class HomeView extends GetView { child: IntroStepBuilder( group: 'home', order: 3, - onHighlightWidgetTap: () { - Intro.of(Get.context!).dispose(); - controller.exploreAIFeatures(); - }, + getOverlayPosition: IntroOverlayBuilder.overlayPosition, overlayBuilder: (params) { return IntroOverlayBuilder.aiBuilder( params, '太棒了!你已成功唤醒小言,接下来试试让它帮你做件事吧', + onTap: () { + params.onFinish(); + controller.exploreAIFeatures(); + }, ); }, builder: (BuildContext context, GlobalKey key) => SizedBox(