mine_trial_membership_countdown_text.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:location/utils/common_expand.dart';
  5. import '../../data/bean/member_status_info.dart';
  6. import '../../resource/string.gen.dart';
  7. class MineTrialMembershipCountdownText extends StatefulWidget {
  8. final MemberStatusInfo? memberStatusInfo;
  9. final VoidCallback? trialHasExpiredCallBack;
  10. const MineTrialMembershipCountdownText({
  11. super.key,
  12. this.memberStatusInfo,
  13. this.trialHasExpiredCallBack
  14. });
  15. @override
  16. State<MineTrialMembershipCountdownText> createState() => _MineTrialMembershipCountdownTextState();
  17. }
  18. class _MineTrialMembershipCountdownTextState extends State<MineTrialMembershipCountdownText> {
  19. late Timer _timer;
  20. String _countdownText = '';
  21. @override
  22. void initState() {
  23. super.initState();
  24. print("controllerffemberStatusInfos-B-${widget.memberStatusInfo}");
  25. _updateTime();
  26. // 创建倒计时定时器
  27. if (widget.memberStatusInfo?.trialed == true &&
  28. widget.memberStatusInfo?.level == 20 &&
  29. (widget.memberStatusInfo?.trialEndTimestamp ?? 0) > 0 ) {
  30. // 计算剩余时间
  31. DateTime remaining = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
  32. if (remaining.second > 0) {
  33. // 创建每秒更新一次的定时器
  34. _timer = Timer.periodic(Duration(seconds: 1), (_) => _updateTime());
  35. }
  36. }
  37. // _timer = Timer.periodic(widget.updateInterval, (_) => _updateTime());
  38. }
  39. void _updateTime() {
  40. print("widgetemberStatusInforialedsfsfdjs---${widget.memberStatusInfo?.trialed}---${(widget.memberStatusInfo?.level ?? 0)}");
  41. _countdownText = StringName.memberExperienceVip;
  42. if ((widget.memberStatusInfo?.trialed ?? false)) {
  43. ///正在使用
  44. if ((widget.memberStatusInfo?.level ?? 0) == 20) {
  45. _countdownisInProgress();
  46. } else {
  47. _timer.cancel();
  48. if (widget.trialHasExpiredCallBack != null) {
  49. widget.trialHasExpiredCallBack!();
  50. }
  51. //已经使用完了
  52. _countdownText = StringName.memberTrialHasExpired;
  53. }
  54. }
  55. if (mounted) {
  56. setState(() {});
  57. }
  58. }
  59. ///正在倒计时
  60. void _countdownisInProgress() {
  61. if (widget.memberStatusInfo?.trialEndTimestamp == null) {
  62. _countdownText = StringName.memberExperienceVip;
  63. return;
  64. }
  65. // 将时间戳转换为DateTime
  66. /*DateTime endTime;
  67. if (widget.timestampInSeconds) {
  68. // 时间戳单位为秒
  69. endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo.endTimestamp! * 1000);
  70. } else {
  71. // 时间戳单位为毫秒
  72. endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo.endTimestamp!);
  73. }*/
  74. DateTime endTime = DateTime.fromMillisecondsSinceEpoch(widget.memberStatusInfo!.trialEndTimestamp ?? 0);
  75. Duration remaining = endTime.difference(DateTime.now());
  76. if (remaining.inSeconds <= 0) {
  77. _countdownText = StringName.memberTrialHasExpired;
  78. _timer.cancel();
  79. } else {
  80. _countdownText = _formatDuration(remaining);
  81. _countdownText = '${StringName.memberCountdownRemaining} ${_countdownText} ${StringName.memberCountdownExperienceTime}';
  82. }
  83. }
  84. String _formatDuration(Duration duration) {
  85. String twoDigits(int n) => n.toString().padLeft(2, '0');
  86. String hours = twoDigits(duration.inHours);
  87. String minutes = twoDigits(duration.inMinutes.remainder(60));
  88. String seconds = twoDigits(duration.inSeconds.remainder(60));
  89. return '$hours:$minutes:$seconds';
  90. }
  91. @override
  92. void dispose() {
  93. _timer.cancel();
  94. super.dispose();
  95. }
  96. @override
  97. Widget build(BuildContext context) {
  98. return Text(
  99. _countdownText,
  100. style: TextStyle(
  101. fontSize: 13.sp,
  102. color: "#8A5F03".color,
  103. fontWeight: FontWeight.bold
  104. )
  105. );
  106. }
  107. }