Browse Source

fix:优化会员到期的状态修改。

zhoukun 6 months ago
parent
commit
450b77f498

+ 7 - 0
ios/Podfile.lock

@@ -44,6 +44,9 @@ PODS:
     - FlutterMacOS
   - permission_handler_apple (9.3.0):
     - Flutter
+  - sqflite_darwin (0.0.4):
+    - Flutter
+    - FlutterMacOS
   - url_launcher_ios (0.0.1):
     - Flutter
   - wechat_kit (6.0.2):
@@ -72,6 +75,7 @@ DEPENDENCIES:
   - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
   - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
   - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
+  - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
   - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
   - wechat_kit (from `.symlinks/plugins/wechat_kit/ios`)
 
@@ -115,6 +119,8 @@ EXTERNAL SOURCES:
     :path: ".symlinks/plugins/path_provider_foundation/darwin"
   permission_handler_apple:
     :path: ".symlinks/plugins/permission_handler_apple/ios"
+  sqflite_darwin:
+    :path: ".symlinks/plugins/sqflite_darwin/darwin"
   url_launcher_ios:
     :path: ".symlinks/plugins/url_launcher_ios/ios"
   wechat_kit:
@@ -141,6 +147,7 @@ SPEC CHECKSUMS:
   package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
   path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
   permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
+  sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
   url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
   wechat_kit: b50b40a52ad88cb9e378a32e300a2d8bdc0e4726
 

+ 1 - 1
lib/data/api/atmob_api.dart

@@ -152,7 +152,7 @@ abstract class AtmobApi {
   Future<BaseResponse> userClear(@Body() AppBaseRequest request);
 
   @POST("/s/v1/member/trial")
-  Future<BaseResponse<MemberTrialResponse>> memberTrial(
+  Future<BaseResponse> memberTrial(
       @Body() AppBaseRequest request);
 
   @POST("/s/v1/item/list")

+ 5 - 6
lib/data/api/atmob_api.g.dart

@@ -1051,14 +1051,13 @@ class _AtmobApi implements AtmobApi {
   }
 
   @override
-  Future<BaseResponse<MemberTrialResponse>> memberTrial(
-      AppBaseRequest request) async {
+  Future<BaseResponse<dynamic>> memberTrial(AppBaseRequest request) async {
     final _extra = <String, dynamic>{};
     final queryParameters = <String, dynamic>{};
     final _headers = <String, dynamic>{};
     final _data = <String, dynamic>{};
     _data.addAll(request.toJson());
-    final _options = _setStreamType<BaseResponse<MemberTrialResponse>>(Options(
+    final _options = _setStreamType<BaseResponse<dynamic>>(Options(
       method: 'POST',
       headers: _headers,
       extra: _extra,
@@ -1075,11 +1074,11 @@ class _AtmobApi implements AtmobApi {
           baseUrl,
         )));
     final _result = await _dio.fetch<Map<String, dynamic>>(_options);
-    late BaseResponse<MemberTrialResponse> _value;
+    late BaseResponse<dynamic> _value;
     try {
-      _value = BaseResponse<MemberTrialResponse>.fromJson(
+      _value = BaseResponse<dynamic>.fromJson(
         _result.data!,
-        (json) => MemberTrialResponse.fromJson(json as Map<String, dynamic>),
+        (json) => json as dynamic,
       );
     } on Object catch (e, s) {
       errorLogger?.logError(e, s, _options);

+ 3 - 4
lib/data/repositories/member_repository.dart

@@ -22,11 +22,10 @@ class MemberRepository {
 
   MemberRepository(this.atmobApi, this.accountRepository);
 
-  Future<int> memberTrial() {
+  Future<void> memberTrial() {
     return atmobApi
         .memberTrial(AppBaseRequest())
-        .then(HttpHandler.handle(false))
-        .then((response) => response.freeMemberMinutes);
+        .then(HttpHandler.handle(true));
   }
 
   Future<ItemListResponse> getMemberList({int? itemListType}) {
@@ -75,7 +74,7 @@ class MemberRepository {
   //试用结束查看试用信息
   Future<MemberTrialInfoResponse>memberTrailInfo() {
     return atmobApi.memberTrailInfo(AppBaseRequest())
-        .then(HttpHandler.handle(false))
+        .then(HttpHandler.handle(true))
         .then((MemberTrialInfoResponse trialInfoResponse) {
           return trialInfoResponse;
     });

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

@@ -142,8 +142,10 @@ class MineController extends BaseController {
   }
 
   void onMemberTryOutClick() {
-    memberRepository.memberTrial().then((freeMemberMinutes) {
-      ToastUtil.show('已获得$freeMemberMinutes分钟会员试用');
+    memberRepository.memberTrial().then((_) {
+      ToastUtil.show('已获得会员试用');
+      ///刷新会员状态。
+      accountRepository.refreshMemberStatus();
     }).catchError((error) {
       if (error is ServerErrorException) {
         if (error.code == ErrorCode.getMemberFree) {
@@ -171,7 +173,7 @@ class MineController extends BaseController {
     memberRepository
         .memberTrailInfo()
         .then((infoRespons) {
-      MineExpirationReminderDialog.show(infoResponse: infoRespons?? MemberTrialInfoResponse(watchTimes: 0,trackCount: 0),onDic: () {
+      MineExpirationReminderDialog.show(infoResponse: infoRespons,onDic: () {
         onMemberCardClick();
       });
       //MineExpirationReminderDialog.show(infoResponse: infoResponse);

+ 1 - 1
lib/module/mine/mine_expiration_reminder_dialog.dart

@@ -195,8 +195,8 @@ class _MineExpirationReminderTipViewState extends State<MineExpirationReminderTi
               alignment: Alignment.center,
               child: GestureDetector(
                 onTap: () {
-                  widget.confirmOnTap;
                   Get.back();
+                  widget.confirmOnTap!();
                 },
                 child: Text(StringName.memberVipRenew,
                     style: TextStyle(

+ 4 - 6
lib/module/mine/mine_page.dart

@@ -110,7 +110,7 @@ class MinePage extends BasePage<MineController> {
           children: [
             AspectRatio(
                 aspectRatio: 332 / 57, child: SizedBox(width: double.infinity)),
-            Obx(() {
+            /*Obx(() {
               return Visibility(
                 visible: controller.isOpenFreeMember == true,
                 child: GestureDetector(
@@ -162,7 +162,7 @@ class MinePage extends BasePage<MineController> {
                   ),
                 ),
               );
-            })
+            })*/
           ],
         ),
         buildMemberCard()
@@ -244,7 +244,6 @@ class MinePage extends BasePage<MineController> {
   }
 
   Widget buildMemberCard() {
-    print("controllerffemberStatusInfos--${controller.memberStatusInfo}");
     return Container(
       decoration: BoxDecoration(
           borderRadius: BorderRadius.only(
@@ -261,7 +260,7 @@ class MinePage extends BasePage<MineController> {
       child: Column(
         children: [
           GestureDetector(
-            onTap: controller.onMemberTryOutClick,
+            onTap: controller.onMemberCardClick,
             child: AspectRatio(
               aspectRatio: 332 / 75,
               child: Container(
@@ -300,7 +299,7 @@ class MinePage extends BasePage<MineController> {
             return Visibility(
                 visible: controller.isLogin,
                 child: GestureDetector(
-                  onTap:!(controller.memberStatusInfo?.trialed ?? false) ? controller.promptWindowPopsCountdownExpires : null,
+                  onTap:!(controller.memberStatusInfo?.trialed ?? false) ? controller.onMemberTryOutClick : null,
                   child: Container(
                     width: double.infinity,
                     padding: EdgeInsets.symmetric(horizontal: 15.w),
@@ -311,7 +310,6 @@ class MinePage extends BasePage<MineController> {
                         SizedBox(width: 4.w,),
                         Expanded(
                           child: Obx(() {
-                            print("controllerffemberStatusInfos-CT-${controller.memberStatusInfo}");
                             return MineTrialMembershipCountdownText(
                               memberStatusInfo: controller.memberStatusInfo ?? MemberStatusInfo(level: 0, endTimestamp: 0, expired: false, permanent: false),
                               trialHasExpiredCallBack: controller.promptWindowPopsCountdownExpires,

+ 88 - 46
lib/module/mine/mine_trial_membership_countdown_text.dart

@@ -22,79 +22,121 @@ class MineTrialMembershipCountdownText extends StatefulWidget {
 }
 
 class _MineTrialMembershipCountdownTextState extends State<MineTrialMembershipCountdownText> {
-  late Timer _timer;
+  Timer? _timer; // 使用可空类型,初始化为null
   String _countdownText = '';
+  bool _isCountdownActive = false; // 标记倒计时是否活跃
 
   @override
   void initState() {
     super.initState();
-    print("controllerffemberStatusInfos-B-${widget.memberStatusInfo}");
-    _updateTime();
+    _initParameter();
+  }
+
+  @override
+  void didUpdateWidget(covariant MineTrialMembershipCountdownText oldWidget) {
+    super.didUpdateWidget(oldWidget);
+    // 检查memberStatusInfo是否有变化
+    if (widget.memberStatusInfo != oldWidget.memberStatusInfo) {
+
+      DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
+      Duration remaining = endTime.difference(DateTime.now());
+      if (!_isCountdownActive) {
+        _resetTimer();
+        _initParameter();
+      }
+    }
+  }
+
+  void _initParameter() {
+    // 清除现有计时器
+    _resetTimer();
 
     // 创建倒计时定时器
-    if (widget.memberStatusInfo?.trialed == true &&
-        widget.memberStatusInfo?.level == 20 &&
-        (widget.memberStatusInfo?.trialEndTimestamp ?? 0) > 0 ) {
+    if (widget.memberStatusInfo?.trialed == true) {
       // 计算剩余时间
-      DateTime remaining = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
-      if (remaining.second > 0) {
+      DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
+      Duration remaining = endTime.difference(DateTime.now());
+      if (remaining.inSeconds > 0) {
+        print("创建新的倒计时定时器");
         // 创建每秒更新一次的定时器
-        _timer = Timer.periodic(Duration(seconds: 1), (_) => _updateTime());
+        _timer = Timer.periodic(const Duration(seconds: 1), (_) => _countdownisInProgress());
+        _isCountdownActive = true;
+        _updateTime();
+        _countdownisInProgress();
+      }  else {
+        _countdownText = StringName.memberTrialHasExpired;
       }
+    } else {
+      // 将时间戳转换为DateTime(根据单位处理)
+      _countdownText = StringName.memberExperienceVip;
     }
-  //  _timer = Timer.periodic(widget.updateInterval, (_) => _updateTime());
   }
 
-  void _updateTime() {
+  void _resetTimer() {
+    // 取消现有计时器并重置状态
+    _timer?.cancel();
+    _timer = null;
+    _isCountdownActive = false;
+  }
 
-    print("widgetemberStatusInforialedsfsfdjs---${widget.memberStatusInfo?.trialed}---${(widget.memberStatusInfo?.level ?? 0)}");
+  void _updateTime() {
+    // 将时间戳转换为DateTime(根据单位处理)
     _countdownText = StringName.memberExperienceVip;
+
     if ((widget.memberStatusInfo?.trialed ?? false)) {
+      DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
+      Duration remaining = endTime.difference(DateTime.now());
       ///正在使用
-      if ((widget.memberStatusInfo?.level ?? 0) == 20) {
-        _countdownisInProgress();
-      } else {
-        _timer.cancel();
-        if (widget.trialHasExpiredCallBack != null) {
-          widget.trialHasExpiredCallBack!();
+      if (remaining.inSeconds > 0) {
+        if (!_isCountdownActive) {
+          _countdownisInProgress();
         }
+      } else {
         //已经使用完了
+        _resetTimer();
         _countdownText = StringName.memberTrialHasExpired;
       }
+    } else {
+      // 未试用或其他状态
+      _resetTimer();
     }
-    if (mounted) {
-      setState(() {});
-    }
+    setState(() {});
   }
 
-  ///正在倒计时
+  /// 正在倒计时
   void _countdownisInProgress() {
-    if (widget.memberStatusInfo?.trialEndTimestamp == null) {
-      _countdownText = StringName.memberExperienceVip;
-      return;
-    }
-
-    // 将时间戳转换为DateTime
-    /*DateTime endTime;
-    if (widget.timestampInSeconds) {
-      // 时间戳单位为秒
-      endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo.endTimestamp! * 1000);
-    } else {
-      // 时间戳单位为毫秒
-      endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo.endTimestamp!);
-    }*/
-
-    DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
-
+    // 检查时间戳是否为空
+    _countdownText = StringName.memberExperienceVip;
+    // 将时间戳转换为DateTime(根据单位处理)
+    final timestamp = widget.memberStatusInfo!.trialEndTimestamp!;
+    DateTime endTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
     Duration remaining = endTime.difference(DateTime.now());
-
-    if (remaining.inSeconds <= 0) {
-      _countdownText = StringName.memberTrialHasExpired;
-      _timer.cancel();
+    //print("倒计时状态---${widget.memberStatusInfo!.trialEndTimestamp}---:${remaining.inSeconds}---${remaining.inSeconds <= 0}---:${DateTime.now()}---:${endTime}");
+
+    if (widget.memberStatusInfo?.trialed == true) {
+        if (remaining.inSeconds == 0) {
+          _resetTimer(); // 取消计时器并重置状态
+          _countdownText = StringName.memberTrialHasExpired;
+          setState(() {});
+          if (widget.trialHasExpiredCallBack != null) {
+            widget.trialHasExpiredCallBack!();
+          }
+        } else {
+          //已经使用完了
+          _countdownText = _formatDuration(remaining);
+          _countdownText = '${StringName.memberCountdownRemaining} ${_countdownText} ${StringName.memberCountdownExperienceTime}';
+          if (mounted) {
+            setState(() {});
+          }
+        }
     } else {
-      _countdownText = _formatDuration(remaining);
-      _countdownText = '${StringName.memberCountdownRemaining} ${_countdownText} ${StringName.memberCountdownExperienceTime}';
+      _resetTimer();
+      _countdownText = StringName.memberExperienceVip;
+      if (mounted) {
+        setState(() {});
+      }
     }
+
   }
 
   String _formatDuration(Duration duration) {
@@ -107,7 +149,7 @@ class _MineTrialMembershipCountdownTextState extends State<MineTrialMembershipCo
 
   @override
   void dispose() {
-    _timer.cancel();
+    _resetTimer(); // 使用统一的方法清理计时器
     super.dispose();
   }