2 İşlemeler 0db7cf2317 ... d3d591d9c1

Yazar SHA1 Mesaj Tarih
  hezihao d3d591d9c1 Merge remote-tracking branch 'origin/v1.0.2' into v1.0.2 6 ay önce
  hezihao 185c798e09 [feat]亲密度分析,识图回复,增加回复语气选项Attach锚点弹窗(未使用) 6 ay önce

+ 86 - 0
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/dialog/reply_tone_option_attach_dialog.dart

@@ -0,0 +1,86 @@
+import 'package:flutter/Material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+
+import '../../../../../data/bean/option_select_config.dart';
+import '../../../../../resource/colors.gen.dart';
+import '../widget/reply_tone_option_list.dart';
+
+/// 回复语气选项Attach锚点弹窗
+class ReplyToneOptionAttachDialog {
+  /// 用于标识弹窗的唯一性
+  static const _tag = "ReplyToneOptionAttachDialog";
+
+  /// 弹窗是否显示中
+  static bool _isShowing = false;
+
+  /// 弹窗是否显示中
+  static bool isShowing() {
+    return _isShowing;
+  }
+
+  /// 显示
+  /// [anchorWidgetKey] 锚点组件的GlobalKey
+  /// [replyToneOptionSelectConfigList] 回复语气列表
+  /// [onSelectOptionCallback] 选择时回调
+  static void show(
+    GlobalKey anchorWidgetKey,
+    BuildContext context, {
+    required List<OptionSelectConfig> replyToneOptionSelectConfigList,
+    required OnSelectOptionCallback onSelectOptionCallback,
+  }) {
+    if (_isShowing) {
+      return;
+    }
+
+    SmartDialog.showAttach(
+      // 绑定唯一tag
+      tag: _tag,
+      // 绑定锚点的BuildContext,才能确定弹窗的显示位置
+      targetContext: context,
+      // 在锚点的顶部显示
+      alignment: Alignment.bottomCenter,
+      // 使用动画
+      useAnimation: true,
+      // 动画类型
+      animationType: SmartAnimationType.fade,
+      // 是否允许事件穿透
+      usePenetrate: false,
+      // 透明遮罩
+      maskColor: ColorName.transparent,
+      // 监听弹窗关闭
+      onDismiss: () {
+        _isShowing = false;
+      },
+      // 构建弹窗内容
+      builder: (_) {
+        return Container(
+          // 固定弹窗的宽度
+          width: double.infinity,
+          margin: EdgeInsets.symmetric(horizontal: 22.w),
+          padding: EdgeInsets.only(left: 14.w, right: 14.w, top: 14.h),
+          decoration: BoxDecoration(
+            color: ColorName.white,
+            border: Border.all(color: ColorName.white, width: 1.0.w),
+            borderRadius: BorderRadius.all(Radius.circular(16.r)),
+          ),
+          child: ReplyToneOptionList(
+            replyToneOptionSelectConfigList: replyToneOptionSelectConfigList,
+            onSelectOptionCallback: onSelectOptionCallback,
+          ),
+        );
+      },
+    );
+
+    // 设置为正在显示中
+    _isShowing = true;
+  }
+
+  /// 隐藏
+  static void dismiss() {
+    if (!_isShowing) {
+      return;
+    }
+    SmartDialog.dismiss(tag: _tag);
+  }
+}

+ 23 - 1
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_controller.dart

@@ -3,6 +3,8 @@ import 'dart:convert';
 import 'dart:io';
 
 import 'package:flutter/cupertino.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
 import 'package:get/get_rx/src/rx_types/rx_types.dart';
 import 'package:get/get_rx/src/rx_workers/rx_workers.dart';
 import 'package:injectable/injectable.dart';
@@ -35,6 +37,7 @@ import '../../../../utils/upload/upload_scene_type.dart';
 import '../../../../utils/upload/upload_state.dart';
 import '../../../store/new_discount/new_discount_page.dart';
 import '../../../store/store_page.dart';
+import 'dialog/reply_tone_option_attach_dialog.dart';
 
 /// 识图回复Controller
 @injectable
@@ -221,7 +224,7 @@ class ScanImageReplyController extends BaseController {
   }
 
   /// 点击再试试按钮
-  void clickRetryBtn() {
+  void clickRetryBtn(BuildContext context) {
     // 分析中,重试
     if (isResultGenerating.value) {
       ToastUtil.show(StringName.intimacyAnalyseIngPleaseWait);
@@ -230,6 +233,25 @@ class ScanImageReplyController extends BaseController {
     _resetData();
   }
 
+  /// 显示或隐藏,回复语气选项弹窗
+  void toggleReplyToneOptionAttachDialog(
+    BuildContext context,
+    GlobalKey anchorBtnKey,
+  ) {
+    ReplyToneOptionAttachDialog.show(
+      anchorBtnKey,
+      context,
+      replyToneOptionSelectConfigList: replyToneOptionSelectConfigList,
+      onSelectOptionCallback: (
+        OptionSelectConfig rowConfig,
+        OptionSelectItem optionItem,
+      ) {
+        // 选中回复语气
+        selectReplyToneOption(rowConfig, optionItem);
+      },
+    );
+  }
+
   /// 重置数据
   void _resetData() {
     isResultGenerating.value = false;

+ 36 - 24
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_view.dart

@@ -33,6 +33,9 @@ class ScanImageReplyView extends BaseView<ScanImageReplyController> {
   /// 回复模式,切换按钮的GlobalKey
   final GlobalKey _replyModeSwitchBtnAnchorKey = GlobalKey();
 
+  /// 显示回复语气弹窗的锚点组件的GlobalKey
+  final GlobalKey _replyToneOptionAttachGlobalKey = GlobalKey();
+
   @override
   Color backgroundColor() {
     return Colors.transparent;
@@ -291,7 +294,7 @@ class ScanImageReplyView extends BaseView<ScanImageReplyController> {
               child: ReplyToneOptionList(
                 replyToneOptionSelectConfigList:
                     controller.replyToneOptionSelectConfigList.value,
-                onSelectOpenCallback: (rowConfig, optionItem) {
+                onSelectOptionCallback: (rowConfig, optionItem) {
                   controller.selectReplyToneOption(rowConfig, optionItem);
                 },
               ),
@@ -317,6 +320,7 @@ class ScanImageReplyView extends BaseView<ScanImageReplyController> {
           borderRadius: BorderRadius.all(Radius.circular(20.r)),
         ),
         child: Column(
+          key: _replyToneOptionAttachGlobalKey,
           children: [
             Container(
               margin: EdgeInsets.only(top: 10.h, bottom: 18.h),
@@ -431,30 +435,38 @@ class ScanImageReplyView extends BaseView<ScanImageReplyController> {
 
   /// 再试试按钮
   Widget _buildRetryBtn() {
-    return GestureDetector(
-      onTap: () {
-        controller.clickRetryBtn();
-      },
-      child: Container(
-        padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 8.h),
-        decoration: BoxDecoration(
-          // 渐变背景
-          gradient: LinearGradient(
-            colors: [ColorName.purpleGradient3, ColorName.purpleGradient4],
-            begin: Alignment.centerLeft,
-            end: Alignment.centerRight,
-          ),
-          borderRadius: BorderRadius.all(Radius.circular(30.r)),
-        ),
-        child: Text(
-          StringName.retry,
-          style: TextStyle(
-            color: ColorName.white,
-            fontSize: 14.sp,
-            fontWeight: FontWeight.w400,
+    return Builder(
+      builder: (context) {
+        return GestureDetector(
+          onTap: () {
+            controller.clickRetryBtn(context);
+            // controller.toggleReplyToneOptionAttachDialog(
+            //   context,
+            //   _replyToneOptionAttachGlobalKey,
+            // );
+          },
+          child: Container(
+            padding: EdgeInsets.symmetric(horizontal: 28.w, vertical: 8.h),
+            decoration: BoxDecoration(
+              // 渐变背景
+              gradient: LinearGradient(
+                colors: [ColorName.purpleGradient3, ColorName.purpleGradient4],
+                begin: Alignment.centerLeft,
+                end: Alignment.centerRight,
+              ),
+              borderRadius: BorderRadius.all(Radius.circular(30.r)),
+            ),
+            child: Text(
+              StringName.retry,
+              style: TextStyle(
+                color: ColorName.white,
+                fontSize: 14.sp,
+                fontWeight: FontWeight.w400,
+              ),
+            ),
           ),
-        ),
-      ),
+        );
+      },
     );
   }
 

+ 4 - 4
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/widget/reply_tone_option_list.dart

@@ -6,7 +6,7 @@ import '../../../../../data/bean/option_select_item.dart';
 import '../../../widget/option_select_widget.dart';
 
 /// 选择时回调
-typedef OnSelectOpenCallback =
+typedef OnSelectOptionCallback =
     void Function(OptionSelectConfig rowConfig, OptionSelectItem optionItem);
 
 /// 回复语气选项列表
@@ -15,12 +15,12 @@ class ReplyToneOptionList extends StatelessWidget {
   final List<OptionSelectConfig> replyToneOptionSelectConfigList;
 
   /// 选择回调
-  final OnSelectOpenCallback onSelectOpenCallback;
+  final OnSelectOptionCallback onSelectOptionCallback;
 
   const ReplyToneOptionList({
     super.key,
     required this.replyToneOptionSelectConfigList,
-    required this.onSelectOpenCallback,
+    required this.onSelectOptionCallback,
   });
 
   @override
@@ -45,7 +45,7 @@ class ReplyToneOptionList extends StatelessWidget {
             OptionSelectConfig rowConfig,
             OptionSelectItem optionItem,
           ) {
-            onSelectOpenCallback(rowConfig, optionItem);
+            onSelectOptionCallback(rowConfig, optionItem);
           },
         ),
         SizedBox(height: 20.h),