import 'dart:async'; import 'package:flutter/material.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 { static const countdownDuration = Duration(minutes: 1); Duration duration = countdownDuration; Timer? timer; bool countDown = true; void reset() { if (countDown) { setState(() => duration = countdownDuration); } else { 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); } }