import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:location/utils/common_expand.dart'; import '../../data/bean/member_status_info.dart'; import '../../resource/string.gen.dart'; class MineTrialMembershipCountdownText extends StatefulWidget { final MemberStatusInfo? memberStatusInfo; final VoidCallback? trialHasExpiredCallBack; const MineTrialMembershipCountdownText({ super.key, this.memberStatusInfo, this.trialHasExpiredCallBack }); @override State createState() => _MineTrialMembershipCountdownTextState(); } class _MineTrialMembershipCountdownTextState extends State { Timer? _timer; // 使用可空类型,初始化为null String _countdownText = ''; bool _isCountdownActive = false; // 标记倒计时是否活跃 @override void initState() { super.initState(); _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) { // 计算剩余时间 DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0); Duration remaining = endTime.difference(DateTime.now()); if (remaining.inSeconds > 0) { print("创建新的倒计时定时器"); // 创建每秒更新一次的定时器 _timer = Timer.periodic(const Duration(seconds: 1), (_) => _countdownisInProgress()); _isCountdownActive = true; _updateTime(); _countdownisInProgress(); } else { _countdownText = StringName.memberTrialHasExpired; } } else { // 将时间戳转换为DateTime(根据单位处理) _countdownText = StringName.memberExperienceVip; } } void _resetTimer() { // 取消现有计时器并重置状态 _timer?.cancel(); _timer = null; _isCountdownActive = false; } 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 (remaining.inSeconds > 0) { if (!_isCountdownActive) { _countdownisInProgress(); } } else { //已经使用完了 _resetTimer(); _countdownText = StringName.memberTrialHasExpired; } } else { // 未试用或其他状态 _resetTimer(); } setState(() {}); } /// 正在倒计时 void _countdownisInProgress() { // 检查时间戳是否为空 _countdownText = StringName.memberExperienceVip; // 将时间戳转换为DateTime(根据单位处理) final timestamp = widget.memberStatusInfo!.trialEndTimestamp!; DateTime endTime = DateTime.fromMillisecondsSinceEpoch(timestamp); Duration remaining = endTime.difference(DateTime.now()); //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 { _resetTimer(); _countdownText = StringName.memberExperienceVip; if (mounted) { setState(() {}); } } } String _formatDuration(Duration duration) { String twoDigits(int n) => n.toString().padLeft(2, '0'); String hours = twoDigits(duration.inHours); String minutes = twoDigits(duration.inMinutes.remainder(60)); String seconds = twoDigits(duration.inSeconds.remainder(60)); return '$hours:$minutes:$seconds'; } @override void dispose() { _resetTimer(); // 使用统一的方法清理计时器 super.dispose(); } @override Widget build(BuildContext context) { return Text( _countdownText, style: TextStyle( fontSize: 13.sp, color: "#8A5F03".color, fontWeight: FontWeight.bold ) ); } }