Browse Source

[feat]亲密度分析,添加自定义预测方向后,添加一个选项到页面中

hezihao 7 tháng trước cách đây
mục cha
commit
1a4ae1ff54

+ 10 - 1
lib/data/bean/option_select_config.dart

@@ -19,7 +19,16 @@ class OptionSelectConfig {
   @JsonKey(name: 'options')
   List<OptionSelectItem> options;
 
-  OptionSelectConfig(this.title, this.iconUrl, this.options);
+  /// 是否自定义
+  @JsonKey(name: 'isCustom')
+  bool isCustom = false;
+
+  OptionSelectConfig(
+    this.title,
+    this.iconUrl,
+    this.options, {
+    this.isCustom = false,
+  });
 
   factory OptionSelectConfig.fromJson(Map<String, dynamic> json) =>
       _$OptionSelectConfigFromJson(json);

+ 2 - 0
lib/data/bean/option_select_config.g.dart

@@ -13,6 +13,7 @@ OptionSelectConfig _$OptionSelectConfigFromJson(Map<String, dynamic> json) =>
       (json['options'] as List<dynamic>)
           .map((e) => OptionSelectItem.fromJson(e as Map<String, dynamic>))
           .toList(),
+      isCustom: json['isCustom'] as bool? ?? false,
     );
 
 Map<String, dynamic> _$OptionSelectConfigToJson(OptionSelectConfig instance) =>
@@ -20,4 +21,5 @@ Map<String, dynamic> _$OptionSelectConfigToJson(OptionSelectConfig instance) =>
       'title': instance.title,
       'iconUrl': instance.iconUrl,
       'options': instance.options,
+      'isCustom': instance.isCustom,
     };

+ 1 - 1
lib/data/bean/option_select_item.dart

@@ -13,7 +13,7 @@ class OptionSelectItem {
   @JsonKey(name: 'selected')
   bool selected;
 
-  OptionSelectItem(this.name, this.selected);
+  OptionSelectItem(this.name, {this.selected = false});
 
   factory OptionSelectItem.fromJson(Map<String, dynamic> json) =>
       _$OptionSelectItemFromJson(json);

+ 4 - 1
lib/data/bean/option_select_item.g.dart

@@ -7,7 +7,10 @@ part of 'option_select_item.dart';
 // **************************************************************************
 
 OptionSelectItem _$OptionSelectItemFromJson(Map<String, dynamic> json) =>
-    OptionSelectItem(json['name'] as String, json['selected'] as bool);
+    OptionSelectItem(
+      json['name'] as String,
+      selected: json['selected'] as bool? ?? false,
+    );
 
 Map<String, dynamic> _$OptionSelectItemToJson(OptionSelectItem instance) =>
     <String, dynamic>{'name': instance.name, 'selected': instance.selected};

+ 15 - 3
lib/module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_controller.dart

@@ -139,7 +139,7 @@ class IntimacyAnalyseUploadController extends BaseController {
           var iconUrl = item.iconUrl ?? "";
           var optionList =
               item.options?.map((value) {
-                return OptionSelectItem(value, false);
+                return OptionSelectItem(value);
               }).toList() ??
               [];
           return OptionSelectConfig(title, iconUrl, optionList);
@@ -259,8 +259,20 @@ class IntimacyAnalyseUploadController extends BaseController {
   void addDirection() {
     // 弹出预测方向的编辑弹窗
     CustomDirectionEditDialog.show((String customDirection) {
-      // 调用接口,新增,并添加一行到页面上
-      ToastUtil.show("保存成功");
+      // 新增一行自定义预测方向的配置项
+      bool firstRowConfigIsCustom =
+          directionOptionSelectConfigList.firstOrNull?.isCustom ?? false;
+      if (directionOptionSelectConfigList.isEmpty || !firstRowConfigIsCustom) {
+        // 没有自定义配置,添加一个
+        directionOptionSelectConfigList[0] = OptionSelectConfig("", "", [
+          OptionSelectItem(customDirection),
+        ], isCustom: true);
+      } else {
+        // 已经有一个,在原来的基础上,添加1个
+        OptionSelectConfig oldConfig = directionOptionSelectConfigList[0];
+        oldConfig.options.add(OptionSelectItem(customDirection));
+      }
+      directionOptionSelectConfigList.refresh();
     });
   }
 

+ 1 - 0
lib/module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_page.dart

@@ -187,6 +187,7 @@ class IntimacyAnalyseUploadPage
             ),
             child: Obx(() {
               return Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   // 添加预测方向按钮
                   Visibility(

+ 6 - 6
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_controller.dart

@@ -84,16 +84,16 @@ class ConversationAnalysisController extends BaseController {
   void _initOptionSelectConfigList() {
     optionSelectConfigList.add(
       OptionSelectConfig("对于TA", "", [
-        OptionSelectItem("现在的需求", false),
-        OptionSelectItem("真实想法", false),
-        OptionSelectItem("渣渣鉴定", false),
+        OptionSelectItem("现在的需求"),
+        OptionSelectItem("真实想法"),
+        OptionSelectItem("渣渣鉴定"),
       ]),
     );
     optionSelectConfigList.add(
       OptionSelectConfig("对于我", "", [
-        OptionSelectItem("帮回", false),
-        OptionSelectItem("告白", false),
-        OptionSelectItem("复合", false),
+        OptionSelectItem("帮回"),
+        OptionSelectItem("告白"),
+        OptionSelectItem("复合"),
       ]),
     );
   }

+ 8 - 8
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_controller.dart

@@ -60,14 +60,14 @@ class ScanImageReplyController extends BaseController {
   void _initReplyToneOptionSelectConfigList() {
     replyToneOptionSelectConfigList.add(
       OptionSelectConfig("选择回复语气", "", [
-        OptionSelectItem("😁 高冷", false),
-        OptionSelectItem("😁 幽默搞笑", false),
-        OptionSelectItem("😁 贴心暖男", false),
-        OptionSelectItem("😁 温柔体贴", false),
-        OptionSelectItem("😁 阳光大男孩", false),
-        OptionSelectItem("😁 都市精英", false),
-        OptionSelectItem("😁 小狼狗", false),
-        OptionSelectItem("😁 小奶狗", false),
+        OptionSelectItem("😁 高冷"),
+        OptionSelectItem("😁 幽默搞笑"),
+        OptionSelectItem("😁 贴心暖男"),
+        OptionSelectItem("😁 温柔体贴"),
+        OptionSelectItem("😁 阳光大男孩"),
+        OptionSelectItem("😁 都市精英"),
+        OptionSelectItem("😁 小狼狗"),
+        OptionSelectItem("😁 小奶狗"),
       ]),
     );
   }

+ 118 - 88
lib/module/intimacy_analyse/widget/option_select_widget.dart

@@ -27,91 +27,109 @@ class OptionSelectWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return Column(
-      crossAxisAlignment: CrossAxisAlignment.start,
-      children: [
-        // 标题
-        _buildTitle(),
-        SizedBox(height: 16.h),
-        // 选项
-        _buildOptionList(),
-      ],
+    return SizedBox(
+      // 宽度匹配父组件
+      width: double.infinity,
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          // 标题
+          _buildTitle(),
+          // 选项
+          _buildOptionList(),
+        ],
+      ),
     );
   }
 
   /// 图标和标题
   Widget _buildTitle() {
     String icon = optionSelect.iconUrl;
-    return Row(
-      children: [
-        Visibility(
-          visible: icon.isNotEmpty,
-          child: Row(
-            children: [
-              // 图标
-              CachedNetworkImage(
-                imageUrl: icon,
-                height: 14.h,
-                width: 14.w,
-                fit: BoxFit.fill,
+    String title = optionSelect.title;
+    // 是否不显示标题
+    bool isNotTitle = icon.isEmpty && title.isEmpty;
+    return Visibility(
+      visible: !isNotTitle,
+      child: Container(
+        margin: EdgeInsets.only(bottom: 16.h),
+        child: Row(
+          children: [
+            Visibility(
+              visible: icon.isNotEmpty,
+              child: Row(
+                children: [
+                  // 图标
+                  CachedNetworkImage(
+                    imageUrl: icon,
+                    height: 14.h,
+                    width: 14.w,
+                    fit: BoxFit.fill,
+                  ),
+                  SizedBox(width: 2),
+                ],
               ),
-              SizedBox(width: 2),
-            ],
-          ),
-        ),
-        // 标题
-        Text(
-          optionSelect.title,
-          style: TextStyle(
-            fontSize: 14.sp,
-            fontWeight: FontWeight.w700,
-            color: ColorName.black80,
-          ),
+            ),
+            // 标题
+            Visibility(
+              visible: title.isNotEmpty,
+              child: Text(
+                optionSelect.title,
+                style: TextStyle(
+                  fontSize: 14.sp,
+                  fontWeight: FontWeight.w700,
+                  color: ColorName.black80,
+                ),
+              ),
+            ),
+          ],
         ),
-      ],
+      ),
     );
   }
 
   /// 选项列表
   Widget _buildOptionList() {
-    // 固定一行3列,每项的宽度一样
-    return GridView.builder(
-      // 去掉默认的Padding,默认会有一个默认的顶部padding大小
-      padding: EdgeInsets.zero,
-      // 包裹内容
-      shrinkWrap: true,
-      // 禁止滚动
-      physics: const NeverScrollableScrollPhysics(),
-      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
-        // 一行3列
-        crossAxisCount: 3,
-        // 水平方向的间距
-        crossAxisSpacing: 6.0,
-        // 垂直方向的间距
-        mainAxisSpacing: 12.0,
-        // 子项的宽高比
-        childAspectRatio: 2.6,
-      ),
-      itemCount: optionSelect.options.length,
-      itemBuilder: (context, index) {
-        OptionSelectItem option = optionSelect.options[index];
-        return _buildOptionItem(optionSelect, option);
-      },
-    );
-
     // 流式布局,类似安卓的FlowLayout,1列不固定3个,放不下就自动换行
-    // return Wrap(
-    //   direction: Axis.horizontal,
-    //   alignment: WrapAlignment.start,
-    //   // 主轴间距
-    //   spacing: 8.0,
-    //   // 交叉轴间距
-    //   runSpacing: 7.0,
-    //   children: [
-    //     for (var option in optionSelect.options)
-    //       _buildOptionItem(optionSelect, option),
-    //   ],
-    // );
+    if (optionSelect.isCustom) {
+      return Wrap(
+        direction: Axis.horizontal,
+        alignment: WrapAlignment.start,
+        runAlignment: WrapAlignment.start,
+        // 主轴间距
+        spacing: 6.0,
+        // 交叉轴间距
+        runSpacing: 7.0,
+        children: [
+          for (var option in optionSelect.options)
+            _buildOptionItem(optionSelect, option),
+        ],
+      );
+    } else {
+      // 固定一行3列,每项的宽度一样
+      return GridView.builder(
+        // 去掉默认的Padding,默认会有一个默认的顶部padding大小
+        padding: EdgeInsets.zero,
+        // 包裹内容
+        shrinkWrap: true,
+        // 禁止滚动
+        physics: const NeverScrollableScrollPhysics(),
+        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+          // 一行3列
+          crossAxisCount: 3,
+          // 水平方向的间距
+          crossAxisSpacing: 6.0,
+          // 垂直方向的间距
+          mainAxisSpacing: 12.0,
+          // 子项的宽高比
+          childAspectRatio: 2.6,
+        ),
+        itemCount: optionSelect.options.length,
+        itemBuilder: (context, index) {
+          OptionSelectItem option = optionSelect.options[index];
+          return _buildOptionItem(optionSelect, option);
+        },
+      );
+    }
   }
 
   /// 选项
@@ -145,27 +163,39 @@ class OptionSelectWidget extends StatelessWidget {
       );
     }
 
+    Widget textWidget = Text(
+      optionItem.name,
+      textAlign: TextAlign.center,
+      maxLines: 1,
+      style: TextStyle(
+        overflow: TextOverflow.ellipsis,
+        fontSize: 13.sp,
+        fontWeight: FontWeight.w400,
+        // 文字颜色,选中时为白色,未选中时为黑色
+        color: optionItem.selected ? ColorName.white : ColorName.black80,
+      ),
+    );
+
+    Widget contentWidget;
+    if (rowConfig.isCustom) {
+      // 自定义,通过Wrap来实现,子项的宽度由自己的内容撑开,通过padding来撑大左右宽度
+      contentWidget = Container(
+        padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h),
+        decoration: bgDecoration,
+        child: textWidget,
+      );
+    } else {
+      // 非自定义,通过GridView来实现,每个子项会平分宽度,通过Center来居中文字
+      contentWidget = Container(
+        decoration: bgDecoration,
+        child: Center(child: textWidget),
+      );
+    }
     return GestureDetector(
       onTap: () {
         optionSelectCallback(rowConfig, optionItem);
       },
-      child: Container(
-        // padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h),
-        decoration: bgDecoration,
-        child: Center(
-          child: Text(
-            optionItem.name,
-            maxLines: 1,
-            style: TextStyle(
-              overflow: TextOverflow.ellipsis,
-              fontSize: 13.sp,
-              fontWeight: FontWeight.w400,
-              // 文字颜色,选中时为白色,未选中时为黑色
-              color: optionItem.selected ? ColorName.white : ColorName.black80,
-            ),
-          ),
-        ),
-      ),
+      child: contentWidget,
     );
   }
 }