| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- 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<MineTrialMembershipCountdownText> createState() => _MineTrialMembershipCountdownTextState();
- }
- class _MineTrialMembershipCountdownTextState extends State<MineTrialMembershipCountdownText> {
- 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
- )
- );
- }
- }
|