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

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:my_flutter_puzzle/cubits/base_cubit_type.dart';
import 'package:my_flutter_puzzle/cubits/count_down_timer_cubit.dart';
class CountDownTimerWidget extends StatefulWidget {
final int duration;
final Function() finishCallback;
const CountDownTimerWidget({Key? key, required this.duration, required this.finishCallback}) : super(key: key);
@override
State<CountDownTimerWidget> createState() => _CountDownTimerWidgetState();
}
class _CountDownTimerWidgetState extends State<CountDownTimerWidget> {
Timer? _countdownTimer;
Duration? myDuration;
late final CountDownTimerCubit _cubit;
@override
void initState() {
_cubit = BlocProvider.of<CountDownTimerCubit>(context);
myDuration = Duration(minutes: widget.duration);
super.initState();
}
void startTimer() {
myDuration = Duration(minutes: widget.duration);
_countdownTimer = Timer.periodic(const Duration(seconds: 1), (_) => setCountDown());
}
void stopTimer() {
setState(() => _countdownTimer!.cancel());
}
void resetTimer() {
stopTimer();
setState(() => myDuration = const Duration(days: 5));
}
void setCountDown() {
const reduceSecondsBy = 1;
setState(() {
final seconds = myDuration!.inSeconds - reduceSecondsBy;
if (seconds < 0) {
widget.finishCallback.call();
_countdownTimer!.cancel();
} else {
myDuration = Duration(seconds: seconds);
}
});
}
@override
Widget build(BuildContext context) {
String strDigits(int n) => n.toString().padLeft(2, '0');
final hours = strDigits(myDuration!.inHours.remainder(24));
final minutes = strDigits(myDuration!.inMinutes.remainder(60));
final seconds = strDigits(myDuration!.inSeconds.remainder(60));
return BlocBuilder<CountDownTimerCubit, BaseCubitType<CountDownTimerState>>(
builder: (context, state) {
switch (state.eventName!) {
case CountDownTimerState.empty:
break;
case CountDownTimerState.start:
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
startTimer();
_cubit.empty();
});
break;
case CountDownTimerState.stop:
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
stopTimer();
_cubit.empty();
});
break;
}
return Row(
children: [
Text(
'$hours:$minutes:$seconds',
style: const TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(width: 8),
const Icon(
Icons.timer,
color: Colors.white,
size: 30,
)
],
);
},
);
}
}