mine_trial_membership_countdown_text.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:location/utils/common_expand.dart';
  6. import '../../data/bean/member_status_info.dart';
  7. import '../../resource/string.gen.dart';
  8. import 'mine_countdown_timer_manager.dart'; // 导入全局定时器管理器
  9. class MineTrialMembershipCountdownText extends StatefulWidget {
  10. final MemberStatusInfo? memberStatusInfo;
  11. final VoidCallback? trialHasExpiredCallBack;
  12. const MineTrialMembershipCountdownText({
  13. super.key,
  14. this.memberStatusInfo,
  15. this.trialHasExpiredCallBack,
  16. });
  17. @override
  18. State<MineTrialMembershipCountdownText> createState() => _MineTrialMembershipCountdownTextState();
  19. }
  20. class _MineTrialMembershipCountdownTextState extends State<MineTrialMembershipCountdownText> {
  21. final MineCountdownTimerManager _timerManager = MineCountdownTimerManager();
  22. String _countdownText = '';
  23. late String _countdownKey; // 倒计时唯一标识
  24. @override
  25. void initState() {
  26. super.initState();
  27. _countdownKey = 'member_trial_countdown_${widget.memberStatusInfo?.hashCode ?? ''}';
  28. _initCountdown();
  29. }
  30. @override
  31. void didUpdateWidget(covariant MineTrialMembershipCountdownText oldWidget) {
  32. super.didUpdateWidget(oldWidget);
  33. // 检查memberStatusInfo是否有变化
  34. if (widget.memberStatusInfo != oldWidget.memberStatusInfo) {
  35. _countdownKey = 'member_trial_countdown_${widget.memberStatusInfo?.hashCode ?? ''}';
  36. _initCountdown();
  37. }
  38. }
  39. void _initCountdown() {
  40. if (widget.memberStatusInfo == null) {
  41. _countdownText = StringName.memberExperienceVip;
  42. return;
  43. }
  44. if (widget.memberStatusInfo?.trialed != true) {
  45. _countdownText = StringName.memberExperienceVip;
  46. _timerManager.cancelCountdown(_countdownKey);
  47. return;
  48. }
  49. final timestamp = widget.memberStatusInfo!.trialEndTimestamp ?? 0;
  50. if (timestamp == 0) {
  51. _countdownText = StringName.memberTrialHasExpired;
  52. _timerManager.cancelCountdown(_countdownKey);
  53. return;
  54. }
  55. // 启动全局倒计时
  56. _timerManager.startCountdown(
  57. key: _countdownKey,
  58. endTimestamp: timestamp,
  59. onExpired: () {
  60. if (mounted) {
  61. setState(() {
  62. _countdownText = StringName.memberTrialHasExpired;
  63. });
  64. }
  65. },
  66. );
  67. //widget.trialHasExpiredCallBack?.call();
  68. // 订阅倒计时更新
  69. _timerManager.getCountdownStream(_countdownKey).listen((formattedTime) {
  70. if (mounted) {
  71. setState(() {
  72. _countdownText = '${StringName.memberCountdownRemaining} $formattedTime ${StringName.memberCountdownExperienceTime}';
  73. });
  74. }
  75. });
  76. // 初始化时计算一次剩余时间
  77. _updateInitialTime();
  78. }
  79. void _updateInitialTime() {
  80. if (widget.memberStatusInfo == null || widget.memberStatusInfo?.trialed != true) {
  81. _countdownText = StringName.memberExperienceVip;
  82. return;
  83. }
  84. final timestamp = widget.memberStatusInfo!.trialEndTimestamp ?? 0;
  85. if (timestamp == 0) {
  86. _countdownText = StringName.memberTrialHasExpired;
  87. return;
  88. }
  89. DateTime endTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
  90. Duration remaining = endTime.difference(DateTime.now());
  91. if (remaining.inSeconds > 0) {
  92. String formattedTime = _timerManager.formatDuration(remaining);
  93. _countdownText = '${StringName.memberCountdownRemaining} $formattedTime ${StringName.memberCountdownExperienceTime}';
  94. } else {
  95. _countdownText = StringName.memberTrialHasExpired;
  96. }
  97. }
  98. @override
  99. void dispose() {
  100. //_timerManager.cancelCountdown(_countdownKey);
  101. super.dispose();
  102. }
  103. @override
  104. Widget build(BuildContext context) {
  105. return Text(
  106. _countdownText,
  107. style: TextStyle(
  108. fontSize: 13.sp,
  109. color: "#8A5F03".color,
  110. fontWeight: FontWeight.bold,
  111. ),
  112. );
  113. }
  114. }