You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.0 KiB

  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_bloc/flutter_bloc.dart';
  4. import 'package:my_flutter_puzzle/cubits/base_cubit_type.dart';
  5. import 'package:my_flutter_puzzle/cubits/count_down_timer_cubit.dart';
  6. class CountDownTimerWidget extends StatefulWidget {
  7. final int duration;
  8. final Function() finishCallback;
  9. const CountDownTimerWidget({Key? key, required this.duration, required this.finishCallback}) : super(key: key);
  10. @override
  11. State<CountDownTimerWidget> createState() => _CountDownTimerWidgetState();
  12. }
  13. class _CountDownTimerWidgetState extends State<CountDownTimerWidget> {
  14. Timer? _countdownTimer;
  15. Duration? myDuration;
  16. late final CountDownTimerCubit _cubit;
  17. @override
  18. void initState() {
  19. _cubit = BlocProvider.of<CountDownTimerCubit>(context);
  20. myDuration = Duration(minutes: widget.duration);
  21. super.initState();
  22. }
  23. void startTimer() {
  24. myDuration = Duration(minutes: widget.duration);
  25. _countdownTimer = Timer.periodic(const Duration(seconds: 1), (_) => setCountDown());
  26. }
  27. void stopTimer() {
  28. if (_countdownTimer == null) {
  29. return;
  30. }
  31. setState(() => _countdownTimer!.cancel());
  32. }
  33. void resetTimer() {
  34. stopTimer();
  35. setState(() => myDuration = const Duration(days: 5));
  36. }
  37. void setCountDown() {
  38. const reduceSecondsBy = 1;
  39. setState(() {
  40. final seconds = myDuration!.inSeconds - reduceSecondsBy;
  41. if (seconds < 0) {
  42. widget.finishCallback.call();
  43. _countdownTimer!.cancel();
  44. } else {
  45. myDuration = Duration(seconds: seconds);
  46. }
  47. });
  48. }
  49. @override
  50. Widget build(BuildContext context) {
  51. String strDigits(int n) => n.toString().padLeft(2, '0');
  52. final hours = strDigits(myDuration!.inHours.remainder(24));
  53. final minutes = strDigits(myDuration!.inMinutes.remainder(60));
  54. final seconds = strDigits(myDuration!.inSeconds.remainder(60));
  55. return BlocBuilder<CountDownTimerCubit, BaseCubitType<CountDownTimerState>>(
  56. builder: (context, state) {
  57. switch (state.eventName!) {
  58. case CountDownTimerState.empty:
  59. break;
  60. case CountDownTimerState.start:
  61. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  62. startTimer();
  63. _cubit.empty();
  64. });
  65. break;
  66. case CountDownTimerState.stop:
  67. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  68. stopTimer();
  69. _cubit.empty();
  70. });
  71. break;
  72. }
  73. return Row(
  74. children: [
  75. Text(
  76. '$hours:$minutes:$seconds',
  77. style: const TextStyle(
  78. fontSize: 30,
  79. fontWeight: FontWeight.bold,
  80. color: Colors.white,
  81. ),
  82. ),
  83. const SizedBox(width: 8),
  84. const Icon(
  85. Icons.timer,
  86. color: Colors.white,
  87. size: 30,
  88. )
  89. ],
  90. );
  91. },
  92. );
  93. }
  94. }