Explorar el Código

[feat]亲密度分析,预测方向只能单选,Ai模型弹窗使用实体类

hezihao hace 9 meses
padre
commit
0ec9d3ed9d

+ 2 - 0
lib/data/api/response/intimacy_analyze_response.dart

@@ -55,4 +55,6 @@ class IntimacyAnalyzeResponse {
 
   factory IntimacyAnalyzeResponse.fromJson(Map<String, dynamic> json) =>
       _$IntimacyAnalyzeResponseFromJson(json);
+
+  Map<String, dynamic> toJson() => _$IntimacyAnalyzeResponseToJson(this);
 }

+ 34 - 23
lib/module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_controller.dart

@@ -9,6 +9,8 @@ import 'package:keyboard/data/bean/upload_info.dart';
 import 'package:keyboard/utils/upload/upload_scene_type.dart';
 import 'package:wechat_assets_picker/wechat_assets_picker.dart';
 import '../../../data/api/response/intimacy_analyze_config_response.dart';
+import '../../../data/api/response/intimacy_analyze_response.dart';
+import '../../../data/bean/ai_model.dart';
 import '../../../data/bean/keyboard_info.dart';
 import '../../../data/bean/option_select_config.dart';
 import '../../../data/bean/option_select_item.dart';
@@ -45,10 +47,10 @@ class IntimacyAnalyseUploadController extends BaseController {
   RxList<UploadInfo> uploadInfoList = <UploadInfo>[].obs;
 
   /// Ai模型列表
-  RxList<String> aiModelList = <String>[].obs;
+  RxList<AiModel> aiModelList = <AiModel>[].obs;
 
   /// 当前应用的Ai模型
-  Rx<String> currentAiModel = ''.obs;
+  Rxn<AiModel> currentAiModel = Rxn();
 
   /// 预测方向的选项列表
   RxList<OptionSelectConfig> directionOptionSelectConfigList =
@@ -90,6 +92,9 @@ class IntimacyAnalyseUploadController extends BaseController {
   /// 当前键盘信息
   Rxn<KeyboardInfo> currentKeyboardInfo = Rxn();
 
+  /// 当前选择的预测方向
+  Rx<String> currentDirectionOption = "".obs;
+
   IntimacyAnalyseUploadController(
     this.intimacyAnalyzeRepository,
     this.intimacyAnalyzeConfigHelper,
@@ -137,11 +142,7 @@ class IntimacyAnalyseUploadController extends BaseController {
 
   /// 初始化Ai模型列表
   void _initAiModelList(IntimacyAnalyzeConfigResponse? config) {
-    List<String> newModelList =
-        config?.modes?.map((item) {
-          return item.name ?? "";
-        }).toList() ??
-        [];
+    List<AiModel> newModelList = config?.modes?.toList() ?? [];
     aiModelList.clear();
     aiModelList.addAll(newModelList);
 
@@ -240,24 +241,32 @@ class IntimacyAnalyseUploadController extends BaseController {
   }
 
   /// 切换Ai模型
-  void switchAiModel(String newAiModel) {
+  void switchAiModel(AiModel newAiModel) {
     currentAiModel.value = newAiModel;
+    currentAiModel.refresh();
   }
 
   /// 添加预测方向
-  void addDirection() {}
+  void addDirection() {
+    // 弹出预测方向的编辑弹窗
+  }
 
   /// 预测方向,选中选项
   void selectDirectionOption(
     OptionSelectConfig rowConfig,
     OptionSelectItem optionItem,
   ) {
-    // 先全部反选
-    rowConfig.options =
-        rowConfig.options.map((ele) {
-          ele.selected = false;
-          return ele;
-        }).toList();
+    // 更新当前选中项
+    currentDirectionOption.value = optionItem.name;
+
+    // 将所有预测方向都反选
+    for (var config in directionOptionSelectConfigList) {
+      config.options =
+          config.options.map((ele) {
+            ele.selected = false;
+            return ele;
+          }).toList();
+    }
     // 再勾选当前的选中项
     optionItem.selected = true;
     // 由于Rx响应式变量,无法监听对象中嵌套对象的某个属性的变化,导致页面不会刷新,需要手动刷新页面
@@ -265,7 +274,7 @@ class IntimacyAnalyseUploadController extends BaseController {
   }
 
   /// 点击了下一步按钮
-  void clickNextBtn() {
+  void clickNextBtn() async {
     // TODO hezihao,需要判断是否解锁,未解锁弹出购买弹窗,目前先直接让通过
 
     // 上传的图片后端地址
@@ -276,14 +285,16 @@ class IntimacyAnalyseUploadController extends BaseController {
     // 键盘Id
     String keyboardId = currentKeyboardInfo.value?.id ?? "";
     // 预测方向
-    // TODO hezihao,多个预测方向,用逗号分割,还是?
-    String direction = "缘分指数";
+    String direction = currentDirectionOption.value;
     // 当前选择的Ai模型
-    String aiModel = currentAiModel.value;
-
-    intimacyAnalyzeRepository.getIntimacyAnalyze(
-      IntimacyAnalyzeRequest(imageList, keyboardId, direction, aiModel),
-    );
+    String aiModel = currentAiModel.value?.value ?? "";
+
+    // 分析亲密度
+    IntimacyAnalyzeResponse response = await intimacyAnalyzeRepository
+        .getIntimacyAnalyze(
+          IntimacyAnalyzeRequest(imageList, keyboardId, direction, aiModel),
+        );
+    AtmobLog.d(tag, "分析亲密度 => ${response.toJson()}");
     isUploadPage.value = false;
   }
 

+ 4 - 3
lib/module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_page.dart

@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:keyboard/base/base_page.dart';
+import 'package:keyboard/data/bean/ai_model.dart';
 import 'package:keyboard/data/bean/option_select_config.dart';
 import 'package:keyboard/data/bean/option_select_item.dart';
 import 'package:keyboard/module/intimacy_analyse/intimacy_analyse_upload/popup/ai_model_select_popup.dart';
@@ -619,8 +620,8 @@ class IntimacyAnalyseUploadPage
               _aiModelSwitchBtnAnchorKey,
               context,
               aiModelList: controller.aiModelList.toList(),
-              currentAiModel: controller.currentAiModel.value,
-              onChooseAiModelCallback: (String newAiModel) {
+              currentAiModel: controller.currentAiModel.value!,
+              onChooseAiModelCallback: (AiModel newAiModel) {
                 controller.switchAiModel(newAiModel);
               },
             );
@@ -648,7 +649,7 @@ class IntimacyAnalyseUploadPage
                       ColorName.aiModelSwitchBtnColor2,
                     ],
                     child: Text(
-                      controller.currentAiModel.value,
+                      controller.currentAiModel.value?.name ?? "",
                       style: TextStyle(
                         fontSize: 14.sp,
                         fontWeight: FontWeight.w500,

+ 9 - 8
lib/module/intimacy_analyse/intimacy_analyse_upload/popup/ai_model_select_popup.dart

@@ -3,11 +3,12 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:keyboard/resource/colors.gen.dart';
 
+import '../../../../data/bean/ai_model.dart';
 import '../../../../resource/assets.gen.dart';
 import '../../../../widget/gradient_text.dart';
 
 /// 选择新的Ai模型时回调
-typedef OnChooseAiModelCallback = void Function(String newAiModel);
+typedef OnChooseAiModelCallback = void Function(AiModel newAiModel);
 
 /// Ai模型选择Popup锚点弹窗
 class AiModelSelectPopup {
@@ -30,8 +31,8 @@ class AiModelSelectPopup {
   static void show(
     GlobalKey anchorBtnKey,
     BuildContext context, {
-    required List<String> aiModelList,
-    required String currentAiModel,
+    required List<AiModel> aiModelList,
+    required AiModel currentAiModel,
     required OnChooseAiModelCallback onChooseAiModelCallback,
   }) {
     if (_isShowing) {
@@ -109,7 +110,7 @@ class AiModelSelectPopup {
                   padding: EdgeInsets.zero,
                   itemCount: aiModelList.length,
                   itemBuilder: (BuildContext context, int index) {
-                    String itemData = aiModelList[index];
+                    AiModel itemData = aiModelList[index];
                     return _buildListItem(
                       index,
                       itemData,
@@ -149,7 +150,7 @@ class AiModelSelectPopup {
   /// 列表项
   static Widget _buildListItem(
     int index,
-    String itemData,
+    AiModel itemData,
     bool isSelected,
     OnChooseAiModelCallback onChooseAiModelCallback,
   ) {
@@ -167,7 +168,7 @@ class AiModelSelectPopup {
         ),
         child: Center(
           child: Text(
-            itemData,
+            itemData.name ?? "",
             style: TextStyle(
               color: ColorName.black80,
               fontSize: 14.sp,
@@ -180,7 +181,7 @@ class AiModelSelectPopup {
   }
 
   /// 当前选中项
-  static Widget _buildCurrentAiModelItem(String currentAiModel) {
+  static Widget _buildCurrentAiModelItem(AiModel currentAiModel) {
     return GestureDetector(
       onTap: () {
         dismiss();
@@ -198,7 +199,7 @@ class AiModelSelectPopup {
                 ColorName.aiModelSwitchBtnColor2,
               ],
               child: Text(
-                currentAiModel,
+                currentAiModel.name ?? "",
                 style: TextStyle(fontSize: 14.sp, fontWeight: FontWeight.w500),
               ),
             ),