mine_countdown_timer_manager.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. import '../../data/repositories/member_repository.dart';
  4. import '../member/member_page.dart';
  5. import 'mine_expiration_reminder_dialog.dart';
  6. /// 全局倒计时定时器管理器(单例模式)
  7. class MineCountdownTimerManager {
  8. static final MineCountdownTimerManager _instance = MineCountdownTimerManager._internal();
  9. factory MineCountdownTimerManager() => _instance;
  10. MineCountdownTimerManager._internal();
  11. // 存储所有倒计时任务
  12. final Map<String, Timer> _timers = {};
  13. final Map<String, StreamController<String>> _streamControllers = {};
  14. final Map<String, Completer<void>> _completers = {};
  15. /// 启动倒计时
  16. Future<void> startCountdown({
  17. required String key, // 倒计时唯一标识
  18. required int endTimestamp, // 结束时间戳(毫秒)
  19. required VoidCallback onExpired, // 过期回调
  20. }) async {
  21. // 取消已存在的同名倒计时
  22. cancelCountdown(key);
  23. // 创建过期回调的Completer
  24. _completers[key] = Completer<void>();
  25. // 计算剩余时间
  26. DateTime endTime = DateTime.fromMillisecondsSinceEpoch(endTimestamp);
  27. Duration remaining = endTime.difference(DateTime.now());
  28. // 如果剩余时间小于等于0,直接触发过期回调
  29. if (remaining.inSeconds <= 0) {
  30. onExpired();
  31. return;
  32. }
  33. // 创建StreamController用于通知UI更新
  34. _streamControllers[key] = StreamController<String>.broadcast();
  35. // 创建定时器
  36. _timers[key] = Timer.periodic(Duration(seconds: 1), (timer) {
  37. DateTime currentTime = DateTime.now();
  38. Duration newRemaining = endTime.difference(currentTime);
  39. if (newRemaining.inSeconds <= 0) {
  40. // 倒计时结束
  41. timer.cancel();
  42. _timers.remove(key);
  43. _streamControllers[key]?.close();
  44. _streamControllers.remove(key);
  45. onExpired();
  46. _completers[key]?.complete();
  47. _completers.remove(key);
  48. ///弹出提示框
  49. MemberRepository memberRepository = MemberRepository.getInstance();
  50. memberRepository
  51. .memberTrailInfo()
  52. .then((infoRespons) {
  53. MineExpirationReminderDialog.show(infoResponse: infoRespons,onDic: () {
  54. MemberPage.start(enterTyp: MemberPageType.afeterTrialMemberEnter);
  55. });
  56. //MineExpirationReminderDialog.show(infoResponse: infoResponse);
  57. }).catchError((){});
  58. } else {
  59. // 发送更新通知
  60. String formattedTime = formatDuration(newRemaining);
  61. _streamControllers[key]?.add(formattedTime);
  62. }
  63. });
  64. }
  65. /// 取消倒计时
  66. void cancelCountdown(String key) {
  67. _timers[key]?.cancel();
  68. _timers.remove(key);
  69. _streamControllers[key]?.close();
  70. _streamControllers.remove(key);
  71. _completers[key]?.complete();
  72. _completers.remove(key);
  73. }
  74. /// 格式化时间
  75. String formatDuration(Duration duration) {
  76. String twoDigits(int n) => n.toString().padLeft(2, '0');
  77. String hours = twoDigits(duration.inHours);
  78. String minutes = twoDigits(duration.inMinutes.remainder(60));
  79. String seconds = twoDigits(duration.inSeconds.remainder(60));
  80. print("hourssfsdfsd---${seconds}");
  81. return '$hours:$minutes:$seconds';
  82. }
  83. /// 获取倒计时流
  84. Stream<String> getCountdownStream(String key) {
  85. return _streamControllers[key]?.stream ?? Stream.empty();
  86. }
  87. /// 等待倒计时结束
  88. Future<void> waitForCountdown(String key) {
  89. return _completers[key]?.future ?? Future.value();
  90. }
  91. /// 清理所有倒计时
  92. void dispose() {
  93. _timers.forEach((key, timer) => timer.cancel());
  94. _timers.clear();
  95. _streamControllers.forEach((key, controller) => controller.close());
  96. _streamControllers.clear();
  97. _completers.clear();
  98. }
  99. }