added structure with navbar, changed icons
parent
62201bf979
commit
ba1a6e37e7
|
@ -1,5 +1,5 @@
|
|||
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());
|
||||
|
||||
|
@ -10,13 +10,6 @@ class MyApp extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
title: _title,
|
||||
home: Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(_title),
|
||||
),
|
||||
body: StopWatchTimerPage()),
|
||||
);
|
||||
return MaterialApp(title: _title, home: MyHomePage());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 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) {
|
||||
return Column(
|
Loading…
Reference in New Issue