126 lines
3.2 KiB
Dart
126 lines
3.2 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:smoke_cess_app/service/settings_service.dart';
|
|
import 'package:smoke_cess_app/widgets/timer_button.dart';
|
|
|
|
class StopWatchTimerPage extends StatefulWidget {
|
|
const StopWatchTimerPage({super.key});
|
|
|
|
@override
|
|
StopWatchTimerPageState createState() => StopWatchTimerPageState();
|
|
}
|
|
|
|
class StopWatchTimerPageState extends State<StopWatchTimerPage> {
|
|
Duration duration = const Duration(minutes: 1);
|
|
Timer? timer;
|
|
|
|
bool countDown = true;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
void reset() {
|
|
setState(() => duration = const Duration());
|
|
}
|
|
|
|
void startTimer() {
|
|
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(),
|
|
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: [
|
|
const SizedBox(
|
|
width: 8,
|
|
),
|
|
buildTimeCard(time: minutes, header: 'MINUTEN'),
|
|
const SizedBox(
|
|
width: 8,
|
|
),
|
|
buildTimeCard(time: seconds, header: 'SEKUNDEN'),
|
|
]);
|
|
}
|
|
|
|
Widget buildTimeCard({required String time, required String header}) =>
|
|
Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Container(
|
|
padding: const EdgeInsets.all(8),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white, borderRadius: BorderRadius.circular(20)),
|
|
child: Text(
|
|
time,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.black,
|
|
fontSize: 50),
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 24,
|
|
),
|
|
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,
|
|
icon: const Icon(
|
|
Icons.stop,
|
|
size: 50,
|
|
color: Colors.white,
|
|
),
|
|
color: Colors.red)
|
|
: TimerButton(
|
|
onClicked: startTimer,
|
|
icon: const Icon(
|
|
Icons.play_arrow,
|
|
size: 50,
|
|
color: Colors.white,
|
|
),
|
|
color: Colors.green);
|
|
}
|
|
}
|