added structure with navbar, changed icons

main
Julian Gegner 2023-02-14 14:02:26 +01:00
parent 62201bf979
commit ba1a6e37e7
9 changed files with 242 additions and 143 deletions

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:smoke_cess_app/screens/stopwatch_timer'; import 'package:smoke_cess_app/pages/main_page.dart';
void main() => runApp(const MyApp()); void main() => runApp(const MyApp());
@ -10,13 +10,6 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(title: _title, home: MyHomePage());
title: _title,
home: Scaffold(
appBar: AppBar(
title: const Text(_title),
),
body: StopWatchTimerPage()),
);
} }
} }

View File

@ -0,0 +1,62 @@
import 'package:flutter/material.dart';
import 'package:smoke_cess_app/pages/mood_page.dart';
import 'package:smoke_cess_app/pages/relapse_page.dart';
import 'package:smoke_cess_app/pages/settings_page.dart';
import 'package:smoke_cess_app/pages/sleep_page.dart';
import 'package:smoke_cess_app/pages/timer_page.dart';
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _selectedIndex = 2;
static final List<Widget> _widgetOptions = <Widget>[
const MoodPage(),
const SleepPage(),
StopWatchTimerPage(),
const RelapsePage(),
const SettingsPage(),
];
void _onItemTapped(int index) {
setState(() => _selectedIndex = index);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('ZI Rauchentwöhnung')),
body: _widgetOptions.elementAt(_selectedIndex),
bottomNavigationBar: NavigationBar(
onDestinationSelected: _onItemTapped,
selectedIndex: _selectedIndex,
destinations: const <Widget>[
NavigationDestination(
icon: Icon(Icons.mood_outlined, color: Colors.black),
label: 'Stimmung'),
NavigationDestination(
icon: Icon(Icons.bedtime_outlined, color: Colors.black),
label: 'Schlaf'),
NavigationDestination(
icon: Icon(
Icons.timer_outlined,
color: Colors.black,
),
label: 'Timer'),
NavigationDestination(
icon: Icon(Icons.smoke_free_outlined, color: Colors.black),
label: 'Rückfall'),
NavigationDestination(
icon: Icon(Icons.settings, color: Colors.black),
label: 'Settings'),
],
//onTap: _onItemTapped,
),
);
}
}

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class MoodPage extends StatelessWidget {
const MoodPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('Hier Fragen wir die Stimmung ab'));
}
}

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class RelapsePage extends StatelessWidget {
const RelapsePage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('Hier werden Rückfälle dokumentiert'));
}
}

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('Hier können Settings eingestellt werden'));
}
}

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class SleepPage extends StatelessWidget {
const SleepPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('Hier wird Schlafqualität abgefragt'));
}
}

View File

@ -0,0 +1,129 @@
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<StopWatchTimerPage> {
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);
}
}

View File

@ -1,130 +0,0 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:smoke_cess_app/widgets/timer_button';
class StopWatchTimerPage extends StatefulWidget {
@override
_StopWatchTimerPageState createState() => _StopWatchTimerPageState();
}
class _StopWatchTimerPageState extends State<StopWatchTimerPage> {
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:'MINUTES'),
SizedBox(width: 8,),
buildTimeCard(time: seconds, header:'SECONDS'),
]
);
}
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);
}
}

View File

@ -5,7 +5,12 @@ final VoidCallback onClicked;
final Icon icon; final Icon icon;
final Color color; final Color color;
const TimerButton({Key? key, required this.onClicked, required this.icon, required this.color}): super(key: key); const TimerButton(
{Key? key,
required this.onClicked,
required this.icon,
required this.color})
: super(key: key);
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(