From 763cf9d627bd6104b94da47688e1efeac4a995fc Mon Sep 17 00:00:00 2001 From: Andreas Fahrecker Date: Thu, 11 Feb 2021 17:05:23 +0100 Subject: [PATCH] Created DatePickerBtn and Started Using it in ProgressCreationScreen Signed-off-by: Andreas Fahrecker --- lib/models/app_exceptions.dart | 11 ++++ lib/models/time_progress.dart | 6 ++- lib/screens/progress_creation_screen.dart | 66 +++++++++++------------ lib/widgets/date_picker_btn.dart | 31 +++++++++++ 4 files changed, 77 insertions(+), 37 deletions(-) create mode 100644 lib/widgets/date_picker_btn.dart diff --git a/lib/models/app_exceptions.dart b/lib/models/app_exceptions.dart index 5272e46..c37d421 100644 --- a/lib/models/app_exceptions.dart +++ b/lib/models/app_exceptions.dart @@ -5,3 +5,14 @@ class TimeProgressInvalidNameException implements Exception { String errMsg() => "The name of a TimeProgress can't be: $invalidName"; } + +class TimeProgressStartTimeIsNotBeforeEndTimeException implements Exception { + final startTime; + final endTime; + + TimeProgressStartTimeIsNotBeforeEndTimeException( + this.startTime, this.endTime); + + String errMsg() => + "The Start Time has to be before the end time. Therefore these values are invalid: Start Time: $startTime EndTime: $endTime"; +} diff --git a/lib/models/time_progress.dart b/lib/models/time_progress.dart index dbd9cc0..e71ca16 100644 --- a/lib/models/time_progress.dart +++ b/lib/models/time_progress.dart @@ -12,9 +12,11 @@ class TimeProgress { TimeProgress(this.name, this.startTime, this.endTime, {String id}) : id = id ?? Uuid().generateV4() { - if (this.name == null || this.name == "") { + if (this.name == null || this.name == "") throw new TimeProgressInvalidNameException(this.name); - } + if (!this.startTime.isBefore(this.endTime)) + throw new TimeProgressStartTimeIsNotBeforeEndTimeException( + startTime, endTime); } factory TimeProgress.initialDefault() { diff --git a/lib/screens/progress_creation_screen.dart b/lib/screens/progress_creation_screen.dart index 6f0afb1..a046642 100644 --- a/lib/screens/progress_creation_screen.dart +++ b/lib/screens/progress_creation_screen.dart @@ -5,10 +5,11 @@ import 'package:time_progress_tracker/actions/actions.dart'; import 'package:time_progress_tracker/models/app_exceptions.dart'; import 'package:time_progress_tracker/models/app_state.dart'; import 'package:time_progress_tracker/models/time_progress.dart'; -import 'package:time_progress_tracker/screens/home_screen.dart'; +import 'package:time_progress_tracker/widgets/date_picker_btn.dart'; class ProgressCreationScreen extends StatefulWidget { static const routeName = "/progress-creation"; + static const title = "Create Time Progress"; @override State createState() { @@ -23,15 +24,7 @@ class _ProgressCreationScreenState extends State { DateTime.now().year + 1, DateTime.now().month, DateTime.now().day); bool _validName = true; - - Future _selectDate( - BuildContext context, DateTime initialDate) async { - return await showDatePicker( - context: context, - initialDate: initialDate, - firstDate: DateTime(DateTime.now().year - 5), - lastDate: DateTime(DateTime.now().year + 5)); - } + bool _validDates = true; void _createTimeProgress(BuildContext context) { try { @@ -44,6 +37,10 @@ class _ProgressCreationScreenState extends State { setState(() { _validName = false; }); + } on TimeProgressStartTimeIsNotBeforeEndTimeException catch (e) { + setState(() { + _validDates = false; + }); } } @@ -59,11 +56,8 @@ class _ProgressCreationScreenState extends State { return Scaffold( appBar: AppBar( - title: Text("Create Time Progress"), + title: Text(ProgressCreationScreen.title), ), - /*drawer: AppDrawer( - appVersion: widget.appVersion, - ),*/ body: Container( padding: EdgeInsets.all(8), child: Column( @@ -81,25 +75,19 @@ class _ProgressCreationScreenState extends State { ), ), ), - Expanded( - child: Text("${_nameController.text}"), - ), Expanded( flex: 1, child: Row( children: [ Expanded( flex: 5, - child: FlatButton( - color: appTheme.accentColor, - child: Text( - "Start Date: ${pickedStartTime.toLocal().toString().split(" ")[0]}"), - onPressed: () async { - DateTime dt = - await _selectDate(context, pickedStartTime); - if (dt != null) { + child: DatePickerBtn( + leadingString: "Start Date:", + pickedDate: pickedStartTime, + onDatePicked: (DateTime startTime) { + if (startTime != null) { setState(() { - pickedStartTime = dt; + pickedStartTime = startTime; }); } }, @@ -110,15 +98,13 @@ class _ProgressCreationScreenState extends State { ), Expanded( flex: 5, - child: FlatButton( - color: appTheme.accentColor, - child: Text( - "End Date: ${pickedEndTime.toLocal().toString().split(" ")[0]}"), - onPressed: () async { - DateTime dt = await _selectDate(context, pickedEndTime); - if (dt != null) { + child: DatePickerBtn( + leadingString: "EndDate:", + pickedDate: pickedEndTime, + onDatePicked: (DateTime endTime) { + if (endTime != null) { setState(() { - pickedEndTime = dt; + pickedEndTime = endTime; }); } }, @@ -127,8 +113,18 @@ class _ProgressCreationScreenState extends State { ], ), ), + _validDates + ? Spacer( + flex: 1, + ) + : Expanded( + child: Center( + child: Text( + "Your Picked Dates are invalid. The Start Date has to be before the end Date."), + ), + ), Spacer( - flex: 5, + flex: 4, ) ], ), diff --git a/lib/widgets/date_picker_btn.dart b/lib/widgets/date_picker_btn.dart new file mode 100644 index 0000000..33a9b26 --- /dev/null +++ b/lib/widgets/date_picker_btn.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class DatePickerBtn extends StatelessWidget { + final String leadingString; + final DateTime pickedDate; + final void Function(DateTime) onDatePicked; + + DatePickerBtn({ + @required this.leadingString, + @required this.pickedDate, + @required this.onDatePicked, + }) : super(); + + @override + Widget build(BuildContext context) { + ThemeData appTheme = Theme.of(context); + return FlatButton( + onPressed: () async { + onDatePicked(await showDatePicker( + context: context, + initialDate: pickedDate, + firstDate: DateTime(1900), + lastDate: DateTime(2100), + )); + }, + child: Text( + "$leadingString ${pickedDate.toLocal().toString().split(" ")[0]}"), + color: appTheme.accentColor, + ); + } +}