فهرست منبع

[new]优化会员挽留弹窗逻辑

zk 4 ماه پیش
والد
کامیت
0576a44664

+ 1 - 0
lib/dialog/member_retain_dialog.dart

@@ -13,6 +13,7 @@ class MemberRetainDialog {
     SmartDialog.show(
         tag: _tag,
         backDismiss: false,
+        keepSingle: true,
         clickMaskDismiss: false,
         builder: (_) {
           return _MemberRetainDialogWidget(

+ 35 - 31
lib/module/member/member_controller.dart

@@ -13,6 +13,7 @@ import 'package:location/data/bean/goods_bean.dart';
 import 'package:location/data/bean/pay_item_bean.dart';
 import 'package:location/data/consts/channel_id.dart';
 import 'package:location/data/repositories/account_repository.dart';
+import 'package:location/data/repositories/config_repository.dart';
 import 'package:location/data/repositories/member_repository.dart';
 import 'package:location/dialog/alipay_qr_code_dialog.dart';
 import 'package:location/handler/error_handler.dart';
@@ -97,8 +98,7 @@ class MemberController extends BaseController implements PaymentStatusCallback {
 
   CancelableFuture? _memberDataFuture;
 
-  ///广告弹窗防抖
-  bool _isPopBackInProgress = false; // 操作进行中标志
+  bool _isShowPayFailedDialog = false; // 是否已经展示过支付失败弹窗
 
   ///检查续订的状态
   final Rx<SubscriptionCheckResponse> _checkResponse =
@@ -296,46 +296,50 @@ class MemberController extends BaseController implements PaymentStatusCallback {
     }
   }
 
+  void _showFreeMemberDialog() {
+    KVUtil.putBool(_keMemberPageShowKey, false);
+    MemberUserCancelPayDialog.show(payClick: () {
+      //获取会员
+      MineController attributionController = Get.find<MineController>();
+      attributionController.onMemberTryOutClick().then((_) {
+        MemberUserCancelPayDialog.dismiss();
+      });
+    }, cancelClick: () {
+      if (Platform.isAndroid) back();
+    });
+  }
+
   ///用户取消支付展示
   void userCancelsPaymentDisplay() {
-    if (_isPopBackInProgress) {
-      // 如果正在处理返回逻辑,直接跳过
-      return;
-    }
-    _isPopBackInProgress = true; // 锁定状态
-    //_keMemberPageShowKey
-    String? memberPageKeyStr = KVUtil.getString(_keMemberPageShowKey, '');
-    if ((memberPageKeyStr ?? '').isEmpty &&
-        (accountRepository.memberStatusInfo.value?.trialed == false)) {
-      ///永久化存储
-      KVUtil.putString(_keMemberPageShowKey, _keMemberPageShowKey);
-      MemberUserCancelPayDialog.show(payClick: () {
-        //获取会员
-        MineController attributionController = Get.find<MineController>();
-        attributionController.onMemberTryOutClick();
-        _isPopBackInProgress = false;
-      }, cancelClick: () {
-        _isPopBackInProgress = false;
-        if (!Platform.isIOS) {
-          back();
-        }
-      });
-    } else {
-      _isPopBackInProgress = false;
-      if (Platform.isAndroid) {
+    final isShowRetainDialog =
+        accountRepository.memberStatusInfo.value?.trialed != true &&
+            KVUtil.getBool(_keMemberPageShowKey, true);
+    if (_isShowPayFailedDialog) {
+      if (isShowRetainDialog &&
+          accountRepository.isLogin.value == true &&
+          ConfigRepository.getInstance().isOpenFreeMember.value == true) {
+        _showFreeMemberDialog();
+      } else if (Platform.isAndroid) {
         back();
       }
+    } else {
+      if (isShowRetainDialog &&
+          accountRepository.isLogin.value == true &&
+          ConfigRepository.getInstance().isOpenFreeMember.value == true) {
+        _showFreeMemberDialog();
+      } else {
+        showRetainDialog(isBack: true);
+      }
     }
   }
 
   ///支付错误的时候调用
-  void showRetainDialog() {
+  void showRetainDialog({bool isBack = false}) {
+    _isShowPayFailedDialog = true;
     MemberRetainDialog.show(payClick: () {
       onBuyClick();
     }, cancelClick: () {
-      if (!Platform.isIOS) {
-        back();
-      }
+      if (Platform.isAndroid && isBack) back();
     });
   }
 

+ 3 - 2
lib/module/member/member_header_cycle_widget.dart

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:location/resource/assets.gen.dart';
+import 'package:location/resource/colors.gen.dart';
 import 'package:smooth_page_indicator/smooth_page_indicator.dart';
 
 // 无限滚动控制器
@@ -97,8 +98,8 @@ class _MemberHeaderCycleWidgetState extends State<MemberHeaderCycleWidget> {
                   dotWidth: 5.0,
                   dotHeight: 5.w,
                   spacing: 4.0,
-                  dotColor: Colors.grey,
-                  activeDotColor: Colors.deepPurple,
+                  dotColor: Colors.grey.shade400,
+                  activeDotColor: ColorName.colorPrimary,
                 ),
                 onDotClicked: (index) {
                   _controller.animateToPage(

+ 1 - 1
lib/module/member/member_user_cancel_pay_dialog.dart

@@ -11,6 +11,7 @@ class MemberUserCancelPayDialog {
       {required VoidCallback payClick, required VoidCallback cancelClick}) {
     SmartDialog.show(
         tag: _tag,
+        keepSingle: true,
         backDismiss: false,
         clickMaskDismiss: false,
         builder: (_) {
@@ -49,7 +50,6 @@ class _MemberUserCancelPayDialogWidget extends Dialog {
                   right: 60.w,
                   child: GestureDetector(
                     onTap: () {
-                      MemberUserCancelPayDialog.dismiss();
                       payClick();
                     },
                     child: Container(

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

@@ -127,8 +127,8 @@ class MineController extends BaseController {
     UrgentContactPage.start();
   }
 
-  void onMemberTryOutClick() {
-    memberRepository.memberTrial().then((_) {
+  Future<void> onMemberTryOutClick() {
+    return memberRepository.memberTrial().then((_) {
       ToastUtil.show('已获得会员试用');
       ///刷新会员状态。
       accountRepository.refreshMemberStatus();
@@ -141,11 +141,14 @@ class MineController extends BaseController {
         } else if (error.code == ErrorCode.noLoginError) {
           ToastUtil.show(StringName.accountNoLogin);
           LoginPage.start();
+          throw error;
         } else {
           ToastUtil.show(error.message);
+          throw error;
         }
       } else {
         ErrorHandler.toastError(error);
+        throw error;
       }
     });
   }

+ 41 - 27
lib/module/mine/mine_page.dart

@@ -61,14 +61,13 @@ class MinePage extends BasePage<MineController> {
                               .image(width: 54.w, height: 54.w);
                     }),
                     SizedBox(width: 10.w),
-                    Expanded(
-                        child: buildLoginInfo()),
+                    Expanded(child: buildLoginInfo()),
                     //Spacer(),
                     Obx(() {
                       return Visibility(
                           visible: controller.isOpenFreeMember == true,
                           child: GestureDetector(
-                              onTap: controller.onMemberTryOutClick,
+                              onTap: () => controller.onMemberTryOutClick(),
                               child: buildMemberTryOutView()));
                     })
                   ],
@@ -216,7 +215,12 @@ class MinePage extends BasePage<MineController> {
       decoration: BoxDecoration(
           color: '#267B7DFF'.color, borderRadius: BorderRadius.circular(26.w)),
       padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 5.w),
-      child: Text(controller.isLogin ? ((controller.memberStatusInfo?.trialed == false) ? StringName.memberTryOut : StringName.memberReceivedMembership) : StringName.memberTryOut,
+      child: Text(
+          controller.isLogin
+              ? ((controller.memberStatusInfo?.trialed == false)
+                  ? StringName.memberTryOut
+                  : StringName.memberReceivedMembership)
+              : StringName.memberTryOut,
           style: TextStyle(fontSize: 12.sp, color: '#8163FF'.color)),
     );
   }
@@ -305,44 +309,52 @@ class MinePage extends BasePage<MineController> {
             return Visibility(
                 visible: controller.isLogin,
                 child: GestureDetector(
-                  onTap:!(controller.memberStatusInfo?.trialed ?? false) ? controller.onMemberTryOutClick : null,
+                  onTap: !(controller.memberStatusInfo?.trialed ?? false)
+                      ? () => controller.onMemberTryOutClick()
+                      : null,
                   child: Container(
                     width: double.infinity,
                     padding: EdgeInsets.symmetric(horizontal: 15.w),
                     height: 32.w,
                     child: Row(
                       children: [
-                        Assets.images.iconMemberVipSign.image(width: 16.w,height: 16.w),
-                        SizedBox(width: 4.w,),
+                        Assets.images.iconMemberVipSign
+                            .image(width: 16.w, height: 16.w),
+                        SizedBox(
+                          width: 4.w,
+                        ),
                         Expanded(
                           child: Obx(() {
                             return MineTrialMembershipCountdownText(
-                              memberStatusInfo: controller.memberStatusInfo ?? MemberStatusInfo(level: 0, endTimestamp: 0, expired: false, permanent: false),
-                              trialHasExpiredCallBack: controller.promptWindowPopsCountdownExpires,
+                              memberStatusInfo: controller.memberStatusInfo ??
+                                  MemberStatusInfo(
+                                      level: 0,
+                                      endTimestamp: 0,
+                                      expired: false,
+                                      permanent: false),
+                              trialHasExpiredCallBack:
+                                  controller.promptWindowPopsCountdownExpires,
                             );
                           }),
                         ),
                         Visibility(
-                            visible: !(controller.memberStatusInfo?.trialed ?? false),
+                            visible: !(controller.memberStatusInfo?.trialed ??
+                                false),
                             child: Row(
                               children: [
-                                Text(
-                                    StringName.memberExperienceVipReceive,
+                                Text(StringName.memberExperienceVipReceive,
                                     style: TextStyle(
                                         fontSize: 13.sp,
                                         color: "#8A5F03".color,
-                                        fontWeight: FontWeight.w400
-                                    )
-                                ),
-                                Assets.images.iconMemberVipMore.image(width: 16.w,height: 16.w)
+                                        fontWeight: FontWeight.w400)),
+                                Assets.images.iconMemberVipMore
+                                    .image(width: 16.w, height: 16.w)
                               ],
-                            )
-                        ),
+                            )),
                       ],
                     ),
                   ),
-                )
-            );
+                ));
           })
         ],
       ),
@@ -413,17 +425,19 @@ class MinePage extends BasePage<MineController> {
           Visibility(
             visible: Platform.isAndroid,
             child: buildMineFunItem(
-              Assets.images.iconMineFunCustomerService.provider(),
-              StringName.mineFunCustomerService,
-                  () => controller.onCustomerServiceClick()),),
+                Assets.images.iconMineFunCustomerService.provider(),
+                StringName.mineFunCustomerService,
+                () => controller.onCustomerServiceClick()),
+          ),
           buildMineFunItem(
               Assets.images.iconMineFunPermissionSetting.provider(),
               StringName.mineFunPermissionSetting,
               () => controller.onPermissionSettingClick()),
-          if (Platform.isAndroid) buildMineFunItem(
-              Assets.images.iconMineFunAccountFeedback.provider(),
-              StringName.mineFunAccountFeedback,
-                  () => controller.onAccountFeedbackClick()),
+          if (Platform.isAndroid)
+            buildMineFunItem(
+                Assets.images.iconMineFunAccountFeedback.provider(),
+                StringName.mineFunAccountFeedback,
+                () => controller.onAccountFeedbackClick()),
           buildMineFunItem(Assets.images.iconMineFunAbout.provider(),
               StringName.mineFunAbout, () => controller.onAboutClick()),
           Obx(() {