cpd_2022_zi/lib/pages/timer_page.dart

125 lines
3.3 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:smoke_cess_app/widgets/timer_button.dart';
class StopWatchTimerPage extends StatefulWidget {
2023-02-14 14:13:32 +01:00
const StopWatchTimerPage({super.key});
@override
2023-02-14 14:13:32 +01:00
StopWatchTimerPageState createState() => StopWatchTimerPageState();
}
2023-02-14 14:13:32 +01:00
class StopWatchTimerPageState extends State<StopWatchTimerPage> {
static const countdownDuration = Duration(minutes: 1);
2023-02-14 14:13:32 +01:00
Duration duration = countdownDuration;
Timer? timer;
bool countDown = true;
void reset() {
if (countDown) {
setState(() => duration = countdownDuration);
} else {
2023-02-14 14:13:32 +01:00
setState(() => duration = const Duration());
}
}
void startTimer() {
2023-02-14 14:13:32 +01:00
timer = Timer.periodic(const Duration(seconds: 1), (_) => addTime());
}
void addTime() {
final addSeconds = countDown ? -1 : 1;
setState(() {
final seconds = duration.inSeconds + addSeconds;
if (seconds < 0) {
timer?.cancel();
} else {
duration = Duration(seconds: seconds);
}
});
}
void stopTimer({bool resets = true}) {
if (resets) {
reset();
}
setState(() => timer?.cancel());
}
@override
Widget build(BuildContext context) => Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
buildTime(),
2023-02-14 14:13:32 +01:00
const SizedBox(
height: 80,
),
buildButtons()
],
),
);
Widget buildTime() {
String twoDigits(int n) => n.toString().padLeft(2, '0');
final minutes = twoDigits(duration.inMinutes.remainder(60));
final seconds = twoDigits(duration.inSeconds.remainder(60));
return Row(mainAxisAlignment: MainAxisAlignment.center, children: [
2023-02-14 14:13:32 +01:00
const SizedBox(
width: 8,
),
buildTimeCard(time: minutes, header: 'MINUTEN'),
2023-02-14 14:13:32 +01:00
const SizedBox(
width: 8,
),
buildTimeCard(time: seconds, header: 'SEKUNDEN'),
]);
}
Widget buildTimeCard({required String time, required String header}) =>
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
2023-02-14 14:13:32 +01:00
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(20)),
child: Text(
time,
2023-02-14 14:13:32 +01:00
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 50),
),
),
2023-02-14 14:13:32 +01:00
const SizedBox(
height: 24,
),
2023-02-14 14:13:32 +01:00
Text(header, style: const TextStyle(color: Colors.black45)),
],
);
Widget buildButtons() {
final isRunning = timer == null ? false : timer!.isActive;
final isCompleted = duration.inSeconds == 0;
return isRunning || isCompleted
? TimerButton(
onClicked: stopTimer,
2023-02-14 14:13:32 +01:00
icon: const Icon(
Icons.stop,
size: 50,
color: Colors.white,
),
color: Colors.red)
: TimerButton(
onClicked: startTimer,
2023-02-14 14:13:32 +01:00
icon: const Icon(
Icons.play_arrow,
size: 50,
color: Colors.white,
),
color: Colors.green);
}
}