瀏覽代碼

[feat]1.增加备案号信息,
2.增加投诉入口,
3.限制词汇个数,
4.修改人设主题与内容的间距,
5.优惠弹窗倒计数结束自动关闭,
6.缩小生成中的爱心动画
7.更改安卓键盘除了选中通用键盘,都去调用服务端的接口

云天逵 7 月之前
父節點
當前提交
dfdfb2360b
共有 28 個文件被更改,包括 269 次插入98 次删除
  1. 二進制
      assets/images/icon_mine_complaint.webp
  2. 二進制
      assets/images/icon_mine_feedback.webp
  3. 11 2
      assets/string/base/string.xml
  4. 1 1
      lib/dialog/keyboard_generating_dialog.dart
  5. 24 1
      lib/module/about/about_page.dart
  6. 1 1
      lib/module/browser/browser_controller.dart
  7. 1 1
      lib/module/change/hobbies/change_hobbies_controller.dart
  8. 1 0
      lib/module/change/nickname/change_nickname_page.dart
  9. 1 0
      lib/module/character/character_view.dart
  10. 4 0
      lib/module/character/content/character_group_content_view.dart
  11. 2 2
      lib/module/character_custom/character_custom_controller.dart
  12. 7 0
      lib/module/character_custom/list/character_custom_list_controller.dart
  13. 5 0
      lib/module/character_custom/list/character_custom_list_page.dart
  14. 55 2
      lib/module/feedback/feedback_controller.dart
  15. 7 12
      lib/module/feedback/feedback_page.dart
  16. 1 1
      lib/module/intro/intro_controller.dart
  17. 2 7
      lib/module/keyboard_manage/keyboard_manage_page.dart
  18. 19 0
      lib/module/main/main_controller.dart
  19. 3 2
      lib/module/mine/mine_controller.dart
  20. 9 1
      lib/module/mine/mine_view.dart
  21. 1 0
      lib/module/new_user/new_user_controller.dart
  22. 2 0
      lib/module/new_user/step/nickname/step_nickname_view.dart
  23. 6 0
      lib/module/profile/profile_controller.dart
  24. 80 63
      lib/module/store/store_page.dart
  25. 1 0
      lib/module/store/suprise/goods_surprise_controller.dart
  26. 6 2
      lib/plugins/keyboard_method_handler.dart
  27. 5 0
      lib/resource/assets.gen.dart
  28. 14 0
      lib/resource/string.gen.dart

二進制
assets/images/icon_mine_complaint.webp


二進制
assets/images/icon_mine_feedback.webp


+ 11 - 2
assets/string/base/string.xml

@@ -12,6 +12,8 @@
     <string name="personal_profile">个人档案</string>
     <string name="feedback">意见反馈</string>
     <string name="about_us">关于我们</string>
+<!--    投诉举报-->
+    <string name="complaint_report">投诉举报</string>
     <string name="mine_account_logged_desc">用户</string>
     <string name="mine_account_no_login">游客,去登录</string>
 
@@ -74,6 +76,12 @@
     <string name="feedback_content_empty">请输入反馈内容</string>
     <string name="feedback_phone_empty">请输入联系电话</string>
     <string name="feedback_submit_success">感谢您的意见与反馈</string>
+<!--    投诉内容-->
+    <string name="complaint_content_title">投诉内容</string>
+    <string name="complaint_content_hint">我们想知道你投诉举报的原因,你可以描述遇到的问题</string>
+    <string name="complaint_content_empty">请输入投诉内容</string>
+    <string name="complaint_content_success">提交成功</string>
+
 
     <!-- 关于我们页面-->
     <string name="current_version">当前版本</string>
@@ -443,7 +451,8 @@
     <string name="new_user_keyboard_generating">正在匹配...</string>
 
     <string name="character_custom_list_empty">无定制人设历史记录</string>
-    <string name="character_custom_list_empty_btn_desc">立即定制人设  ></string>
-
+    <string name="character_custom_list_empty_btn_desc">立即定制人设 ></string>
 
+    <string name="developer_name">开发者:阜阳奇幻网络科技有限公司</string>
+    <string name="record_number">备案号:皖ICP备2025079055号-2A</string>
 </resources>

+ 1 - 1
lib/dialog/keyboard_generating_dialog.dart

@@ -35,7 +35,7 @@ class KeyboardGeneratingDialog {
               Lottie.asset(
                 Assets.anim.animKeyboardGeneratingData,
                 repeat: true,
-                width: 298.w,
+                width: 196.w,
                 fit: BoxFit.contain,
               ),
               Positioned(

+ 24 - 1
lib/module/about/about_page.dart

@@ -53,7 +53,6 @@ class AboutPage extends BasePage<AboutController> {
                         width: 72.w,
                         height: 72.w,
                         decoration: BoxDecoration(
-
                           borderRadius: BorderRadius.circular(16.r),
                         ),
                         child: Assets.images.iconAppLogo.image(
@@ -123,6 +122,30 @@ class AboutPage extends BasePage<AboutController> {
                     ],
                   ),
                 ),
+                Spacer(),
+                Container(
+                  margin: EdgeInsets.only(bottom: 8.w),
+                  child: Text(
+                    StringName.developerName,
+                    style: TextStyle(
+                      fontSize: 12.sp,
+                      color: Colors.black.withAlpha(102),
+                      fontWeight: FontWeight.w400,
+                    ),
+                  ),
+                ),
+                Container(
+                  margin: EdgeInsets.only(bottom: 40.w),
+                  child: Text(
+                    StringName.recordNumber,
+                    style: TextStyle(
+                      fontSize: 12.sp,
+                      color: Colors.black.withAlpha(102),
+                      fontWeight: FontWeight.w400,
+                    ),
+                  ),
+                ),
+
               ],
             ),
           ),

+ 1 - 1
lib/module/browser/browser_controller.dart

@@ -53,7 +53,7 @@ class BrowserController extends BaseController {
   }
 
   void _getTitle() async {
-    await Future.delayed(const Duration(milliseconds: 500));
+    await Future.delayed(const Duration(seconds: 500));
     webViewController.getTitle().then((title) {
       if (title != null) {
         this.title.value = title;

+ 1 - 1
lib/module/change/hobbies/change_hobbies_controller.dart

@@ -104,7 +104,7 @@ class ChangeHobbiesController extends BaseController {
     AtmobLog.d(tag, "clickHobbiesCustom");
     CustomLabelDialog.show(
       title: StringName.addHobbies,
-      maxLength: currentCharacterCustomConfig?.maxHobbyWords ?? 10,
+      maxLength: currentCharacterCustomConfig?.maxHobbyWords ?? 5,
       hintText: StringName.customLabelHobbiesHint,
       clickCallback: (value) {
         final isExist = hobbiesLabelsList.map((e) => e.name).contains(value);

+ 1 - 0
lib/module/change/nickname/change_nickname_page.dart

@@ -105,6 +105,7 @@ class ChangeNicknamePage extends BasePage<ChangeNicknameController> {
               },
               cursorColor: Color(0xFF7B7DFF),
               textAlign: TextAlign.center,
+              style: Styles.getTextStyleBlack204W500(18.sp),
               textAlignVertical: TextAlignVertical.center,
               decoration: InputDecoration(
                 counterText: "",

+ 1 - 0
lib/module/character/character_view.dart

@@ -66,6 +66,7 @@ class CharacterView extends BaseView<CharacterController> {
           children: [
             Column(
               children: [
+                // 去定制人设的位置
                 SizedBox(height: 31.h),
                 Container(
                   decoration: ShapeDecoration(

+ 4 - 0
lib/module/character/content/character_group_content_view.dart

@@ -23,6 +23,9 @@ class CharacterGroupContentView
 
       Column(
       children: [
+        SizedBox(
+          height: 8.w,
+        ),
         Expanded(
           child: Obx(() {
             return EasyRefresh(
@@ -40,6 +43,7 @@ class CharacterGroupContentView
               // onRefresh: controller.refreshData,
               onLoad: controller.loadMoreData,
               child: ListView.separated(
+                padding: EdgeInsets.zero,
                 itemCount: controller.characterList.length,
                 itemBuilder: (context, index) {
                   return _buildListItem(

+ 2 - 2
lib/module/character_custom/character_custom_controller.dart

@@ -64,7 +64,7 @@ class CharacterCustomController extends BaseController {
   void clickHobbiesCustom() {
     AtmobLog.d(tag, "clickHobbiesCustom");
     CustomLabelDialog.show(
-      maxLength: currentCharacterCustomConfig?.maxHobbyWords ?? 10,
+      maxLength: currentCharacterCustomConfig?.maxHobbyWords ?? 5,
       hintText: StringName.customLabelHobbiesHint,
       clickCallback: (value) {
         hobbiesLabelsList.map((e) => e.name).contains(value)
@@ -78,7 +78,7 @@ class CharacterCustomController extends BaseController {
   void clickCharacterCustom() {
     AtmobLog.d(tag, "clickCharacterCustom");
     CustomLabelDialog.show(
-      maxLength: currentCharacterCustomConfig?.maxCharacterWords ?? 10,
+      maxLength: currentCharacterCustomConfig?.maxCharacterWords ?? 5,
       hintText: StringName.customLabelCharacterHint,
       clickCallback: (value) {
         characterLabelsList.map((e) => e.name).contains(value)

+ 7 - 0
lib/module/character_custom/list/character_custom_list_controller.dart

@@ -37,6 +37,8 @@ class CharacterCustomListController extends BaseController {
 
   late EasyRefreshController refreshController;
 
+  final RxBool isLoading = false.obs;
+
   CharacterCustomListController(
     this.charactersRepository,
     this.keyboardRepository,
@@ -57,8 +59,13 @@ class CharacterCustomListController extends BaseController {
 
   // 下拉刷新
   Future<void> refreshData() async {
+
     _currentPage.value = 1;
+    isLoading.value = true;
     await getCurrentCharacterListInfo(isRefresh: true);
+    Future.delayed(Duration(milliseconds: 500), () {
+      isLoading.value = false;
+    });
     refreshController.finishRefresh();
     refreshController.resetFooter(); // 允许加载更多
   }

+ 5 - 0
lib/module/character_custom/list/character_custom_list_page.dart

@@ -52,6 +52,11 @@ class CharacterCustomListPage extends BasePage<CharacterCustomListController> {
                     SizedBox(height: 26.h),
                     Expanded(
                       child: Obx(() {
+                        if (controller.isLoading.value) {
+                          return Center(
+                            child: CircularProgressIndicator(),
+                          );
+                        }
                         if (controller.characterList.isEmpty) {
                           return _buildCustomListEmpty();
                         }

+ 55 - 2
lib/module/feedback/feedback_controller.dart

@@ -8,11 +8,22 @@ import '../../resource/string.gen.dart';
 import '../../utils/error_handler.dart';
 import '../../utils/toast_util.dart';
 
+enum FeedbackType {
+  feedback(1),
+  complaint(2);
+
+  final int value;
+
+  const FeedbackType(this.value);
+}
+
 @injectable
 class FeedbackController extends BaseController {
   final RxString _phone = ''.obs;
   final RxString _content = "".obs;
 
+  final Rx<FeedbackType> type = FeedbackType.feedback.obs;
+
   get phone => _phone.value;
 
   get content => _content.value;
@@ -36,7 +47,12 @@ class FeedbackController extends BaseController {
 
   submitClick() {
     if (_content.value.isEmpty) {
-      ToastUtil.show(StringName.feedbackContentEmpty);
+      if (type.value == FeedbackType.feedback) {
+        ToastUtil.show(StringName.feedbackContentEmpty);
+      } else {
+        ToastUtil.show(StringName.complaintContentEmpty);
+      }
+
       return;
     }
     if (_phone.value.isEmpty) {
@@ -46,11 +62,48 @@ class FeedbackController extends BaseController {
     accountRepository
         .complaintSubmit(_phone.value, _content.value)
         .then((data) {
-          ToastUtil.show(StringName.feedbackSubmitSuccess);
+          if (type.value == FeedbackType.feedback) {
+            ToastUtil.show(StringName.feedbackSubmitSuccess);
+          } else {
+            ToastUtil.show(StringName.complaintContentSuccess);
+          }
           Get.back();
         })
         .catchError((error) {
           ErrorHandler.toastError(error);
+          ToastUtil.show("提交失败,请稍后重试");
         });
   }
+
+  @override
+  void onInit() {
+    super.onInit();
+    final arguments = Get.arguments;
+    if (arguments != null && arguments["type"] != null) {
+      type.value = arguments["type"];
+    }
+  }
+
+  getTitleText() {
+    if (type.value == FeedbackType.feedback) {
+      return StringName.feedback;
+    } else {
+      return StringName.complaintReport;
+    }
+  }
+  getContentTitle(){
+    if (type.value == FeedbackType.feedback) {
+      return StringName.feedbackContentTitle;
+    } else {
+      return StringName.complaintContentTitle;
+    }
+  }
+
+  getContentHint() {
+    if (type.value == FeedbackType.feedback) {
+      return StringName.feedbackContentHint;
+    } else {
+      return StringName.complaintContentHint;
+    }
+  }
 }

+ 7 - 12
lib/module/feedback/feedback_page.dart

@@ -15,8 +15,8 @@ import '../../utils/styles.dart';
 class FeedbackPage extends BasePage<FeedbackController> {
   const FeedbackPage({super.key});
 
-  static start() {
-    Get.toNamed(RoutePath.feedback);
+  static start(FeedbackType type) {
+    Get.toNamed(RoutePath.feedback, arguments: {"type": type});
   }
 
   @override
@@ -33,7 +33,7 @@ class FeedbackPage extends BasePage<FeedbackController> {
       resizeToAvoidBottomInset: false,
       backgroundColor: backgroundColor(),
       appBar: CommonAppBar(
-        title: StringName.feedback,
+        title: controller.getTitleText(),
         backgroundColor: backgroundColor,
         onBack: () {
           controller.backClick();
@@ -63,7 +63,7 @@ class FeedbackPage extends BasePage<FeedbackController> {
                       crossAxisAlignment: CrossAxisAlignment.start,
                       children: [
                         Text(
-                          StringName.feedbackContentTitle,
+                          controller.getContentTitle(),
                           style: TextStyle(
                             color: Colors.black,
                             fontSize: 14.sp,
@@ -80,7 +80,7 @@ class FeedbackPage extends BasePage<FeedbackController> {
                             textAlignVertical: TextAlignVertical.top,
                             decoration: InputDecoration(
                               counterText: "",
-                              hintText: StringName.feedbackContentHint,
+                              hintText: controller.getContentHint(),
                               hintStyle: TextStyle(
                                 color: Colors.black.withAlpha(66),
                               ),
@@ -157,15 +157,10 @@ class FeedbackPage extends BasePage<FeedbackController> {
               child: Container(
                 height: 48.h,
                 alignment: Alignment.center,
-                decoration:
-                Styles.getActivateButtonDecoration(
-                  31.r,
-                ),
+                decoration: Styles.getActivateButtonDecoration(31.r),
                 child: Text(
                   StringName.feedbackSubmit,
-                  style: Styles.getTextStyleWhiteW500(
-                    16.sp,
-                  ),
+                  style: Styles.getTextStyleWhiteW500(16.sp),
                 ),
               ),
             ),

+ 1 - 1
lib/module/intro/intro_controller.dart

@@ -108,7 +108,7 @@ class IntroController extends BaseController {
   void clickLogin() {
     Timer(const Duration(milliseconds: 500), () {
       if (AccountRepository.getInstance().isLogin.value) {
-        ToastUtil.show("已登录登录");
+        ToastUtil.show("您已登录~");
         return;
       }
       LoginDialog.show();

+ 2 - 7
lib/module/keyboard_manage/keyboard_manage_page.dart

@@ -470,20 +470,15 @@ class KeyboardManagePage extends BasePage<KeyboardManageController> {
           color: const Color(0xFFC9C2DB),
           // 虚线颜色
           strokeWidth: 1.0.w,
+          dashPattern: [5, 5],
           // 线条宽度
-          borderType: BorderType.Rect,
+          borderType: BorderType.RRect,
           // 圆角矩形
           radius: Radius.circular(8.r),
           // 圆角半径
           child: Container(
             width: 102.w,
             height: 38.h,
-            decoration: ShapeDecoration(
-              color: const Color(0xFFF5F4F9),
-              shape: RoundedRectangleBorder(
-                borderRadius: BorderRadius.circular(8.r),
-              ),
-            ),
             alignment: Alignment.center,
             child: Row(
               mainAxisAlignment: MainAxisAlignment.center,

+ 19 - 0
lib/module/main/main_controller.dart

@@ -8,8 +8,11 @@ import 'package:keyboard/data/repository/config_repository.dart';
 import 'package:keyboard/data/repository/keyboard_repository.dart';
 import 'package:keyboard/data/repository/store_repository.dart';
 import 'package:keyboard/module/main/enums/main_tab.dart';
+import 'package:keyboard/module/new_user/new_user_page.dart';
+import 'package:keyboard/module/store/new_discount/new_discount_page.dart';
 
 import '../../base/base_controller.dart';
+import '../../data/bean/member_info.dart';
 import '../../resource/assets.gen.dart';
 import '../../resource/string.gen.dart';
 
@@ -34,6 +37,11 @@ class MainController extends BaseController {
   final StoreRepository storeRepository;
   final CharactersRepository charactersRepository;
 
+  bool get isLogin => accountRepository.isLogin.value;
+
+  MemberInfo? get memberStatusInfo => accountRepository.memberStatusInfo.value;
+
+
   MainController(
     this.accountRepository,
     this.keyboardRepository,
@@ -96,6 +104,17 @@ class MainController extends BaseController {
     super.onInit();
     // 第一次显示首页,显示键盘引导页
     KeyboardTutorialUtil.firstMainPageShowTutorial();
+
+
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    if (memberStatusInfo != null && memberStatusInfo!.isMember&&isLogin) {
+      return;
+    }
+    NewDiscountPage.start();
   }
 
   /// 处理跳转参数

+ 3 - 2
lib/module/mine/mine_controller.dart

@@ -7,6 +7,7 @@ import 'package:keyboard/base/base_controller.dart';
 import 'package:keyboard/data/api/response/user_info_response.dart';
 import 'package:keyboard/data/bean/member_info.dart';
 import 'package:keyboard/module/about/about_page.dart';
+import 'package:keyboard/module/feedback/feedback_controller.dart';
 import 'package:keyboard/module/feedback/feedback_page.dart';
 import 'package:keyboard/module/user_info/user_info_page.dart';
 
@@ -125,10 +126,10 @@ class MineController extends BaseController {
     UserProfilePage.start();
   }
 
-  clickFeedback() {
+  clickFeedback(FeedbackType type) {
     if (isLogin) {
       debugPrint('clickOnlineCustomerService');
-      FeedbackPage.start();
+      FeedbackPage.start(type);
     } else {
       ToastUtil.show('请先登录');
       LoginDialog.show();

+ 9 - 1
lib/module/mine/mine_view.dart

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:keyboard/base/base_view.dart';
+import 'package:keyboard/module/feedback/feedback_controller.dart';
 import 'package:keyboard/module/mine/mine_controller.dart';
 import 'package:keyboard/resource/string.gen.dart';
 
@@ -72,10 +73,17 @@ class MineView extends BaseView<MineController> {
           baseFunctionButton(
             text: StringName.feedback,
             funIcon: Assets.images.iconMineFeedback.path,
-            onTap: controller.clickFeedback,
+            onTap: (){controller.clickFeedback(FeedbackType.feedback);},
           ),
 
           baseFunctionButton(
+            text: StringName.complaintReport,
+            funIcon: Assets.images.iconMineComplaint.path,
+            onTap: (){controller.clickFeedback(FeedbackType.complaint);},
+          ),
+
+
+          baseFunctionButton(
             text: StringName.aboutUs,
             funIcon: Assets.images.iconMineAbout.path,
             onTap: controller.clickAboutUs,

+ 1 - 0
lib/module/new_user/new_user_controller.dart

@@ -105,6 +105,7 @@ class NewUserController extends BaseController
   }
 
   void clickUseGeneralMode() {
+
     MainPage.start();
   }
 

+ 2 - 0
lib/module/new_user/step/nickname/step_nickname_view.dart

@@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:keyboard/base/base_view.dart';
 import 'package:keyboard/module/new_user/new_user_controller.dart';
 import 'package:flutter/material.dart';
+import 'package:keyboard/utils/styles.dart';
 
 import '../../../../resource/string.gen.dart';
 class StepNicknameView extends BaseView<NewUserController>{
@@ -64,6 +65,7 @@ class StepNicknameView extends BaseView<NewUserController>{
           onChanged: (value) {
             controller.nickname.value = value;
           },
+          style: Styles.getTextStyleBlack204W500(18.sp),
           cursorColor: Color(0xFF7B7DFF),
           textAlign: TextAlign.center,
           textAlignVertical: TextAlignVertical.center,

+ 6 - 0
lib/module/profile/profile_controller.dart

@@ -43,6 +43,12 @@ class ProfileController extends BaseController {
   @override
   void onInit() {
     super.onInit();
+
+  }
+@override
+void onReady() {
+    super.onReady();
+
     getCustomKeyboard();
   }
 

+ 80 - 63
lib/module/store/store_page.dart

@@ -782,10 +782,21 @@ class StorePage extends BasePage<StoreController> {
       child: Column(
         children: [
           GestureDetector(
+
             onTap: controller.clickPayNow,
             child: Container(
+              alignment: Alignment.topCenter,
+                width: 328.w,
+                height: 56.w,
+              decoration: ShapeDecoration(
+                color: const Color(0xFFFFF587),
+                shape: RoundedRectangleBorder(
+                  borderRadius: BorderRadius.circular(30.55.r),
+                ),
+              ),
+            child: Container(
               width: 328.w,
-              height: 54.h,
+              height: 54.w,
               decoration: ShapeDecoration(
                 gradient: LinearGradient(
                   begin: Alignment(0.60, -0.39),
@@ -807,78 +818,84 @@ class StorePage extends BasePage<StoreController> {
                   style: Styles.getTextStyleWhiteW500(17.sp),
                 ),
               ),
-            ),
+            )),
           ),
-          SizedBox(height: 11.h),
-          Row(
-            mainAxisAlignment: MainAxisAlignment.center,
-            children: [
-              Obx(() {
-                return GestureDetector(
-                  behavior: HitTestBehavior.opaque,
-                  onTap: () {
-                    controller.isAgree.value = !controller.isAgree.value;
-                  },
-                  child:
-                      controller.isAgree.value
-                          ? Assets.images.iconStoreAgreePrivacy.image(
-                            width: 16.w,
-                            height: 16.w,
-                          )
-                          : SizedBox(
-                            child: Container(
-                              padding: EdgeInsets.all(1.w),
-                              width: 16.w,
-                              height: 16.w,
-                              child: Container(
-                                decoration: BoxDecoration(
-                                  shape: BoxShape.circle,
-                                  border: Border.all(
-                                    color: Colors.black.withAlpha(153),
-                                    width: 1.w,
-                                  ),
-                                ),
-                              ),
-                            ),
-                          ),
-                );
-              }),
-              Text.rich(
-                TextSpan(
-                  children: [
-                    TextSpan(
-                      text: StringName.textSpanIHaveReadAndAgree,
-                      style: TextStyle(
-                        color: Colors.black.withAlpha(153),
-                        fontSize: 10.sp,
-                        fontWeight: FontWeight.w400,
-                      ),
-                    ),
-                    ClickTextSpan(
-                      text: StringName.textSpanPrivacyPolicy,
-                      url: WebUrl.privacyPolicy,
-                    ),
 
-                    TextSpan(
-                      text: StringName.textSpanAnd,
-                      style: TextStyle(
+          _buildPrivacy(),
+        ],
+      ),
+    );
+  }
+
+  Widget _buildPrivacy(){
+    return Row(
+      mainAxisAlignment: MainAxisAlignment.center,
+      children: [
+        Obx(() {
+          return GestureDetector(
+              behavior: HitTestBehavior.opaque,
+              onTap: () {
+                controller.isAgree.value = !controller.isAgree.value;
+              },
+              child:Padding(
+                padding: EdgeInsets.symmetric(vertical: 10.w,horizontal: 10.w),child:
+              controller.isAgree.value
+                  ? Assets.images.iconStoreAgreePrivacy.image(
+                width: 16.w,
+                height: 16.w,
+              )
+                  : SizedBox(
+                child: Container(
+                  padding: EdgeInsets.all(1.w),
+                  width: 16.w,
+                  height: 16.w,
+                  child: Container(
+                    decoration: BoxDecoration(
+                      shape: BoxShape.circle,
+                      border: Border.all(
                         color: Colors.black.withAlpha(153),
-                        fontSize: 10.sp,
-                        fontWeight: FontWeight.w400,
+                        width: 1.w,
                       ),
                     ),
+                  ),
+                ),
+              ),)
+          );
+        }),
+        Transform.translate(offset: Offset(-10.w,0),child:
+        Text.rich(
+          TextSpan(
+            children: [
+              TextSpan(
+                text: StringName.textSpanIHaveReadAndAgree,
+                style: TextStyle(
+                  color: Colors.black.withAlpha(153),
+                  fontSize: 10.sp,
+                  fontWeight: FontWeight.w400,
+                ),
+              ),
+              ClickTextSpan(
+                text: StringName.textSpanPrivacyPolicy,
+                url: WebUrl.privacyPolicy,
+              ),
 
-                    ClickTextSpan(
-                      text: StringName.textSpanServiceTerms,
-                      url: WebUrl.serviceAgreement,
-                    ),
-                  ],
+              TextSpan(
+                text: StringName.textSpanAnd,
+                style: TextStyle(
+                  color: Colors.black.withAlpha(153),
+                  fontSize: 10.sp,
+                  fontWeight: FontWeight.w400,
                 ),
               ),
+
+              ClickTextSpan(
+                text: StringName.textSpanServiceTerms,
+                url: WebUrl.serviceAgreement,
+              ),
             ],
           ),
-        ],
-      ),
+        ),)
+      ],
     );
   }
 }

+ 1 - 0
lib/module/store/suprise/goods_surprise_controller.dart

@@ -57,6 +57,7 @@ class GoodsSurpriseController extends BaseController {
         timeLeft.value--;
       } else {
         timer.cancel();
+        SmartDialog.dismiss();
       }
     });
   }

+ 6 - 2
lib/plugins/keyboard_method_handler.dart

@@ -6,6 +6,7 @@ import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:keyboard/data/repository/chat_repository.dart';
 import 'package:keyboard/data/repository/keyboard_repository.dart';
+import 'package:keyboard/module/keyboard_manage/keyboard_manage_controller.dart';
 import 'package:keyboard/utils/atmob_log.dart';
 
 import '../data/api/response/chat_prologue_response.dart';
@@ -21,8 +22,6 @@ class KeyboardMethodHandler {
   final tag = "KeyboardMethodHandler";
 
 
-
-
   bool get isLogin => KVUtil.getBool(Constants.keyIsLogin, false);
 
   bool get isMember => KVUtil.getBool(Constants.keyIsMember, false);
@@ -99,12 +98,17 @@ class KeyboardMethodHandler {
     final selectedKeyboard = keyboardListResponse.keyboardInfos
         .firstWhereOrNull((element) => element.id == keyboardId);
     if (selectedKeyboard != null) {
+      if(selectedKeyboard.type == KeyboardType.custom.name) {
+        await KeyboardRepository.getInstance().keyboardChoose(keyboardId:keyboardId);
+        KeyboardRepository.getInstance().refreshData();
+      }
       KVUtil.putString(Constants.keyboardSelect, jsonEncode(selectedKeyboard.toJson()));
     }
     return "{}";
   }
 
   Future<String> _handleGetCurrentKeyboardInfo(MethodCall call) async {
+    AtmobLog.d(tag, "_handleGetCurrentKeyboardInfo");
     final String? keyboardJsonStr = KVUtil.getString(Constants.keyboardSelect, null);
     if (keyboardJsonStr != null) {
       try {

+ 5 - 0
lib/resource/assets.gen.dart

@@ -856,6 +856,10 @@ class $AssetsImagesGen {
   AssetGenImage get iconMineBackArrow =>
       const AssetGenImage('assets/images/icon_mine_back_arrow.webp');
 
+  /// File path: assets/images/icon_mine_complaint.webp
+  AssetGenImage get iconMineComplaint =>
+      const AssetGenImage('assets/images/icon_mine_complaint.webp');
+
   /// File path: assets/images/icon_mine_feedback.webp
   AssetGenImage get iconMineFeedback =>
       const AssetGenImage('assets/images/icon_mine_feedback.webp');
@@ -1391,6 +1395,7 @@ class $AssetsImagesGen {
     iconMineAbout,
     iconMineArrow,
     iconMineBackArrow,
+    iconMineComplaint,
     iconMineFeedback,
     iconMineLoginArrow,
     iconMineOnlineCustomerService,

+ 14 - 0
lib/resource/string.gen.dart

@@ -11,6 +11,7 @@ class StringName {
   static final String personalProfile = 'personal_profile'.tr; // 个人档案
   static final String feedback = 'feedback'.tr; // 意见反馈
   static final String aboutUs = 'about_us'.tr; // 关于我们
+  static final String complaintReport = 'complaint_report'.tr; // 投诉举报
   static final String mineAccountLoggedDesc = 'mine_account_logged_desc'.tr; // 用户
   static final String mineAccountNoLogin = 'mine_account_no_login'.tr; // 游客,去登录
   static final String directSend = 'direct_send'.tr; // 生成内容直接发送
@@ -61,6 +62,10 @@ class StringName {
   static final String feedbackContentEmpty = 'feedback_content_empty'.tr; // 请输入反馈内容
   static final String feedbackPhoneEmpty = 'feedback_phone_empty'.tr; // 请输入联系电话
   static final String feedbackSubmitSuccess = 'feedback_submit_success'.tr; // 感谢您的意见与反馈
+  static final String complaintContentTitle = 'complaint_content_title'.tr; // 投诉内容
+  static final String complaintContentHint = 'complaint_content_hint'.tr; // 我们想知道你投诉举报的原因,你可以描述遇到的问题
+  static final String complaintContentEmpty = 'complaint_content_empty'.tr; // 请输入投诉内容
+  static final String complaintContentSuccess = 'complaint_content_success'.tr; // 提交成功
   static final String currentVersion = 'current_version'.tr; // 当前版本
   static final String privacyPolicy = 'privacy_policy'.tr; // 隐私政策
   static final String serviceTerms = 'service_terms'.tr; // 服务条款
@@ -332,6 +337,8 @@ class StringName {
   static final String newUserKeyboardGenerating = 'new_user_keyboard_generating'.tr; // 正在匹配...
   static final String characterCustomListEmpty = 'character_custom_list_empty'.tr; // 无定制人设历史记录
   static final String characterCustomListEmptyBtnDesc = 'character_custom_list_empty_btn_desc'.tr; // 立即定制人设 >
+  static final String developerName = 'developer_name'.tr; // 开发者:阜阳奇幻网络科技有限公司
+  static final String recordNumber = 'record_number'.tr; // 备案号:皖ICP备2025079055号-2A
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -346,6 +353,7 @@ class StringMultiSource {
       'personal_profile': '个人档案',
       'feedback': '意见反馈',
       'about_us': '关于我们',
+      'complaint_report': '投诉举报',
       'mine_account_logged_desc': '用户',
       'mine_account_no_login': '游客,去登录',
       'direct_send': '生成内容直接发送',
@@ -396,6 +404,10 @@ class StringMultiSource {
       'feedback_content_empty': '请输入反馈内容',
       'feedback_phone_empty': '请输入联系电话',
       'feedback_submit_success': '感谢您的意见与反馈',
+      'complaint_content_title': '投诉内容',
+      'complaint_content_hint': '我们想知道你投诉举报的原因,你可以描述遇到的问题',
+      'complaint_content_empty': '请输入投诉内容',
+      'complaint_content_success': '提交成功',
       'current_version': '当前版本',
       'privacy_policy': '隐私政策',
       'service_terms': '服务条款',
@@ -667,6 +679,8 @@ class StringMultiSource {
       'new_user_keyboard_generating': '正在匹配...',
       'character_custom_list_empty': '无定制人设历史记录',
       'character_custom_list_empty_btn_desc': '立即定制人设 >',
+      'developer_name': '开发者:阜阳奇幻网络科技有限公司',
+      'record_number': '备案号:皖ICP备2025079055号-2A',
     },
   };
 }