added structure with navbar, changed icons
parent
62201bf979
commit
ba1a6e37e7
|
@ -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()),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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(
|
Loading…
Reference in New Issue