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