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.

102 lines
2.9 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. setState(() => _countdownTimer!.cancel());
  29. }
  30. void resetTimer() {
  31. stopTimer();
  32. setState(() => myDuration = const Duration(days: 5));
  33. }
  34. void setCountDown() {
  35. const reduceSecondsBy = 1;
  36. setState(() {
  37. final seconds = myDuration!.inSeconds - reduceSecondsBy;
  38. if (seconds < 0) {
  39. widget.finishCallback.call();
  40. _countdownTimer!.cancel();
  41. } else {
  42. myDuration = Duration(seconds: seconds);
  43. }
  44. });
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. String strDigits(int n) => n.toString().padLeft(2, '0');
  49. final hours = strDigits(myDuration!.inHours.remainder(24));
  50. final minutes = strDigits(myDuration!.inMinutes.remainder(60));
  51. final seconds = strDigits(myDuration!.inSeconds.remainder(60));
  52. return BlocBuilder<CountDownTimerCubit, BaseCubitType<CountDownTimerState>>(
  53. builder: (context, state) {
  54. switch (state.eventName!) {
  55. case CountDownTimerState.empty:
  56. break;
  57. case CountDownTimerState.start:
  58. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  59. startTimer();
  60. _cubit.empty();
  61. });
  62. break;
  63. case CountDownTimerState.stop:
  64. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  65. stopTimer();
  66. _cubit.empty();
  67. });
  68. break;
  69. }
  70. return Row(
  71. children: [
  72. Text(
  73. '$hours:$minutes:$seconds',
  74. style: const TextStyle(
  75. fontSize: 30,
  76. fontWeight: FontWeight.bold,
  77. color: Colors.white,
  78. ),
  79. ),
  80. const SizedBox(width: 8),
  81. const Icon(
  82. Icons.timer,
  83. color: Colors.white,
  84. size: 30,
  85. )
  86. ],
  87. );
  88. },
  89. );
  90. }
  91. }