|
|
@@ -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();
|
|
|
}
|
|
|
|