diff --git a/example/.metadata b/example/.metadata index 39f2501..31b763f 100644 --- a/example/.metadata +++ b/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled. version: - revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 channel: stable project_type: app @@ -13,26 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 - platform: android - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 - platform: ios - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 - platform: linux - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 - platform: macos - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 - platform: web - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 - platform: windows - create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 - base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1 + create_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 + base_revision: ffccd96b62ee8cec7740dab303538c5fc26ac543 # User provided section diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 0833ecf..2fb4ea1 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.example" + applicationId "com.iconica.example" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion flutter.minSdkVersion diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml index 45d523a..39e01cb 100644 --- a/example/android/app/src/debug/AndroidManifest.xml +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.iconica.example"> + diff --git a/lib/flutter_date_time_picker.dart b/lib/flutter_date_time_picker.dart index 6868c03..2f6f3b5 100644 --- a/lib/flutter_date_time_picker.dart +++ b/lib/flutter_date_time_picker.dart @@ -2,3 +2,8 @@ library flutter_date_time_picker; export 'src/date_time_picker.dart'; export 'src/enums/date_box_shape.dart'; +export 'src/models/date_box_base_theme.dart'; +export 'src/models/date_box_disabled_theme.dart'; +export 'src/models/date_box_highlight_theme.dart'; +export 'src/models/date_box_selected_theme.dart'; +export 'src/models/date_time_picker_theme.dart'; \ No newline at end of file diff --git a/lib/src/date_time_picker.dart b/lib/src/date_time_picker.dart index 0c8be82..bc027d8 100644 --- a/lib/src/date_time_picker.dart +++ b/lib/src/date_time_picker.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter_date_time_picker/src/enums/date_box_shape.dart'; +import 'package:flutter_date_time_picker/src/models/date_time_picker_theme.dart'; import 'package:flutter_date_time_picker/src/utils/date_time_picker_controller.dart'; import 'package:flutter_date_time_picker/src/widgets/month_date_time_picker.dart/month_date_time_picker_sheet.dart'; import 'package:flutter_date_time_picker/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart'; @@ -9,27 +9,42 @@ import 'package:intl/date_symbol_data_local.dart'; /// A widget that displays a date picker from a sheet form the top of the screen. /// This sheet displays initialy displays a week of days but can be dragged down to show full months. -/// Both views can be dragged sideways to show the next or previous wweek/month. +/// Both views can be dragged sideways to show the next or previous week/month. /// /// The child will be the [Widget] that is displayed underneath the date picker in the stack. /// +/// +/// [initialDate] indicates the starting date. Default is [DateTime.now() +/// +/// [pickTime] is a [bool] that determines if the user is able to pick a time after picking a date. +/// true will always tirgger a [TimePickerDialog]. +/// false will nvever trigger a [TimePickerDialog]. This is default. +/// +/// [use24HourFormat] is a [bool] to set de clock on [TimePickerDialog] to a fixed 24 or 12-hour format. +/// By default this gets determined by the [Locale] on the device. +/// +/// [dateTimePickerTheme] is used the set the global theme of the [DateTimePicker] +/// /// The header [Widget] will be displayed above the date picker in the modal sheet in a column. /// -/// onTapDay is a callback that provides the taped date as a [DateTime] object. +/// [onTapDay] is a callback that provides the taped date as a [DateTime] object. /// -/// highlightToday is a [bool] that determines which day shall we highlighted. +/// [highlightToday] is a [bool] that determines which day shall we highlighted. /// true will always highlight the current date. This is standard. /// false will highlight the currently selected date by either the initial date or the one chosen by the user. -/// [highlighColor] is used as background for the highlighted day. -/// [toggleableActiveColor] is used for the text color when highlighted. -/// [disabledColor] is used for the text color when not highlighted. +/// final Widget? child; +/// +/// [markedDates] contain the dates [DateTime] that will be marked in the picker by a small dot. +/// +/// [disabledDates] contain the dates [DateTime] that will be disabled and cannot be interacted with whatsoever. +/// +/// [disabledTimes] contain the time [TimeOfDay] that cannot be picked in the [TimePickerDialog]. /// -/// markedDates contain the dates [DateTime] that will be marked in the picker by a small dot. -/// [indicatorColor] is used for the color of the dot. /// /// Example: /// ```dart -/// ShellDatePicker( +/// DatePicker( +/// dateTimePickerTheme: const DateTimePickerTheme() /// initialDate: selectedDate, /// highlightToday: false, /// onTapDay: (date) { @@ -112,35 +127,29 @@ import 'package:intl/date_symbol_data_local.dart'; ///``` class DateTimePicker extends StatefulWidget { DateTimePicker({ - required this.child, - this.weekDateBoxSize = 35, - this.monthDateBoxSize = 45, + this.dateTimePickerTheme = const DateTimePickerTheme(), this.header, this.onTapDay, this.highlightToday = true, bool? use24HourFormat, this.pickTime = false, - this.dateBoxSize, - this.dateBoxShape = DateBoxShape.roundedRectangle, this.initialDate, this.markedDates, this.disabledDates, this.disabledTimes, + this.child, super.key, }) { alwaysUse24HourFormat = use24HourFormat ?? useTimeFormatBasedOnLocale(); } - final Widget child; + final Widget? child; + final DateTimePickerTheme dateTimePickerTheme; final Widget? header; final Function(DateTime)? onTapDay; final bool highlightToday; late final bool alwaysUse24HourFormat; final bool pickTime; - final double? dateBoxSize; - final DateBoxShape dateBoxShape; - final double weekDateBoxSize; - final double monthDateBoxSize; final DateTime? initialDate; final List? markedDates; final List? disabledDates; @@ -165,7 +174,7 @@ class _DateTimePickerState extends State { highlightToday: widget.highlightToday, alwaysUse24HourFormat: widget.alwaysUse24HourFormat, pickTime: widget.pickTime, - dateBoxShape: widget.dateBoxShape, + theme: widget.dateTimePickerTheme, header: widget.header, markedDates: widget.markedDates, disabledDates: widget.disabledDates, @@ -176,8 +185,6 @@ class _DateTimePickerState extends State { ); _dateTimePickerController.addListener(() { - print('BROWSING DATE: ${_dateTimePickerController.browsingDate}'); - print('SELECTED DATE: ${_dateTimePickerController.selectedDate}'); setState(() {}); }); } @@ -193,7 +200,9 @@ class _DateTimePickerState extends State { Widget build(BuildContext context) { return Stack( children: [ - widget.child, + if (widget.child != null) ...[ + widget.child!, + ], RotatedBox( quarterTurns: 2, child: DraggableScrollableSheet( @@ -201,7 +210,7 @@ class _DateTimePickerState extends State { snap: true, minChildSize: 0.2, initialChildSize: 0.2, - maxChildSize: 0.68, + maxChildSize: 0.6, builder: (context, scrollController) { double dragSize = _dragController.isAttached ? _dragController.size : 0; @@ -233,12 +242,14 @@ class _DateTimePickerState extends State { ? WeekDateTimePickerSheet( dateTimePickerController: _dateTimePickerController, - weekDateBoxSize: widget.weekDateBoxSize, + weekDateBoxSize: widget + .dateTimePickerTheme.weekDateBoxSize, ) : MonthDateTimePickerSheet( dateTimePickerController: _dateTimePickerController, - monthDateBoxSize: widget.monthDateBoxSize, + monthDateBoxSize: widget + .dateTimePickerTheme.monthDateBoxSize, ), ), ), diff --git a/lib/src/models/date_box_base_theme.dart b/lib/src/models/date_box_base_theme.dart new file mode 100644 index 0000000..2dc6283 --- /dev/null +++ b/lib/src/models/date_box_base_theme.dart @@ -0,0 +1,15 @@ +import 'package:flutter/widgets.dart' show Color, TextStyle; + +class DateBoxBaseTheme { + /// Default date theme. + const DateBoxBaseTheme( + this.backgroundColor, + this.textStyle, + ); + + /// Background color of default date + final Color? backgroundColor; + + /// The style of the date number. + final TextStyle? textStyle; +} diff --git a/lib/src/models/date_box_current_theme.dart b/lib/src/models/date_box_current_theme.dart new file mode 100644 index 0000000..1c1f6d8 --- /dev/null +++ b/lib/src/models/date_box_current_theme.dart @@ -0,0 +1,15 @@ +import 'package:flutter/widgets.dart' show Color, TextStyle; + +class DateBoxCurrentTheme { + /// Default date theme. + const DateBoxCurrentTheme( + this.backgroundColor, + this.textStyle, + ); + + /// Background color of default date + final Color backgroundColor; + + /// The style of the date number. + final TextStyle textStyle; +} diff --git a/lib/src/models/date_box_disabled_theme.dart b/lib/src/models/date_box_disabled_theme.dart new file mode 100644 index 0000000..7172fe5 --- /dev/null +++ b/lib/src/models/date_box_disabled_theme.dart @@ -0,0 +1,15 @@ +import 'package:flutter/widgets.dart' show Color, TextStyle; + +class DateBoxDisabledTheme { + /// Disabled date theme. + const DateBoxDisabledTheme( + this.backgroundColor, + this.textStyle, + ); + + /// Background color of selected date. + final Color? backgroundColor; + + /// The style of the date number. + final TextStyle? textStyle; +} diff --git a/lib/src/models/date_box_highlight_theme.dart b/lib/src/models/date_box_highlight_theme.dart new file mode 100644 index 0000000..97a26bd --- /dev/null +++ b/lib/src/models/date_box_highlight_theme.dart @@ -0,0 +1,15 @@ +import 'package:flutter/widgets.dart' show Color, TextStyle; + +class DateBoxHighlightTheme { + /// Highlighted date theme. + const DateBoxHighlightTheme( + this.backgroundColor, + this.textStyle, + ); + + /// Background color of highlighted date. + final Color? backgroundColor; + + /// The style of the date number. + final TextStyle? textStyle; +} diff --git a/lib/src/models/date_box_selected_theme.dart b/lib/src/models/date_box_selected_theme.dart new file mode 100644 index 0000000..abe73af --- /dev/null +++ b/lib/src/models/date_box_selected_theme.dart @@ -0,0 +1,15 @@ +import 'package:flutter/widgets.dart' show Color, TextStyle; + +class DateBoxSelectedTheme { + /// Selected date theme. + const DateBoxSelectedTheme( + this.backgroundColor, + this.textStyle, + ); + + /// Background color of selected date. + final Color? backgroundColor; + + /// The style of the date number. + final TextStyle? textStyle; +} diff --git a/lib/src/models/date_time_picker_theme.dart b/lib/src/models/date_time_picker_theme.dart new file mode 100644 index 0000000..79d1968 --- /dev/null +++ b/lib/src/models/date_time_picker_theme.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_date_time_picker/flutter_date_time_picker.dart'; +import 'package:flutter_date_time_picker/src/models/date_box_base_theme.dart'; +import 'package:flutter_date_time_picker/src/models/date_box_disabled_theme.dart'; +import 'package:flutter_date_time_picker/src/models/date_box_highlight_theme.dart'; +import 'package:flutter_date_time_picker/src/models/date_box_selected_theme.dart'; + +class DateTimePickerTheme { + /// The [DateTimePickerTheme] to style [DateTimePicker] in. Define a custom shape for the dates and specifically style + /// a basic, hightlighted, selected and disabled date. + const DateTimePickerTheme({ + this.weekDateBoxSize = 35, + this.monthDateBoxSize = 45, + this.markedIndicatorColor, + this.dateBoxShape = DateBoxShape.roundedRectangle, + this.baseTheme = const DateBoxBaseTheme( + Colors.white, + TextStyle(color: Colors.black), + ), + this.highlightTheme = const DateBoxHighlightTheme( + Colors.blue, + TextStyle(color: Colors.white), + ), + this.selectedTheme = const DateBoxSelectedTheme( + Color(0xFFBBDEFB), + TextStyle(color: Colors.blue), + ), + this.disabledTheme = const DateBoxDisabledTheme( + Colors.grey, + TextStyle(color: Colors.white), + ), + }); + + /// enum to define a shape dor the date. use [DateBoxShape.circle]. + /// For a ciruclar date, [DateBoxShape.rectangle] for a plain box and [DateBoxShape.roundedRectangle] to het a rectangle with small rounded borders. + final DateBoxShape dateBoxShape; + + /// This theme is used to style a default look for the dates. + final DateBoxBaseTheme baseTheme; + + /// This theme is used for when a specific date is highlighted. + final DateBoxHighlightTheme highlightTheme; + + /// This theme is used for when a specific date is slected by the user. + final DateBoxSelectedTheme selectedTheme; + + /// This theme is used for when a specific date is disabled. + final DateBoxDisabledTheme disabledTheme; + + /// Size of date box in a week view. + final double weekDateBoxSize; + + /// Size of date box in a month view. + final double monthDateBoxSize; + + /// The color used for a indicator for a marked date. + final Color? markedIndicatorColor; +} diff --git a/lib/src/utils/date_time_picker_controller.dart b/lib/src/utils/date_time_picker_controller.dart index 8e45c83..099379e 100644 --- a/lib/src/utils/date_time_picker_controller.dart +++ b/lib/src/utils/date_time_picker_controller.dart @@ -1,23 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:flutter_date_time_picker/src/enums/date_box_shape.dart'; +import 'package:flutter_date_time_picker/src/models/date_time_picker_theme.dart'; class DateTimePickerController extends ChangeNotifier { DateTimePickerController({ + required this.theme, required this.highlightToday, required this.alwaysUse24HourFormat, required this.pickTime, - required this.dateBoxShape, - + required this.browsingDate, + required this.selectedDate, this.header, this.markedDates, this.disabledDates, this.disabledTimes, this.onTapDayCallBack, - required this.browsingDate, - required this.selectedDate, }); - final PageController _pageController = PageController(initialPage: 1); final bool highlightToday; @@ -25,7 +23,7 @@ class DateTimePickerController extends ChangeNotifier { final Widget? header; - final DateBoxShape dateBoxShape; + final DateTimePickerTheme theme; final List? markedDates; final List? disabledDates; @@ -56,7 +54,7 @@ class DateTimePickerController extends ChangeNotifier { ); } - void onTapDay(date) { + void onTapDay(DateTime date) { browsingDate = date; selectedDate = date; @@ -69,9 +67,7 @@ class DateTimePickerController extends ChangeNotifier { } } - PageController getPageController() { - return _pageController; - } + PageController get pageController => _pageController; void setBrowsingDate(DateTime date) { browsingDate = date; diff --git a/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker.dart b/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker.dart index aea0bec..d02f661 100644 --- a/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker.dart +++ b/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_date_time_picker/src/enums/date_box_shape.dart'; import 'package:flutter_date_time_picker/src/extensions/date_time.dart'; import 'package:flutter_date_time_picker/src/extensions/time_of_day.dart'; +import 'package:flutter_date_time_picker/src/models/date_box_current_theme.dart'; +import 'package:flutter_date_time_picker/src/models/date_time_picker_theme.dart'; import 'package:flutter_date_time_picker/src/utils/date_time_picker_controller.dart'; class MonthDateTimePicker extends StatelessWidget { @@ -37,7 +39,7 @@ class MonthDateTimePicker extends StatelessWidget { DateTime(date.year, date.month).daysInMonth() + (daysToSkip >= 7 ? 0 : daysToSkip), (index) { - late Map calendarColors; + late DateBoxCurrentTheme currentDateBoxTheme; int addedIndex = index; @@ -48,11 +50,8 @@ class MonthDateTimePicker extends StatelessWidget { return const SizedBox.shrink(); } - calendarColors = determineColors( - context, - addedIndex, - daysToSkip, - ); + currentDateBoxTheme = determineCurrentDateBoxTheme(context, + addedIndex, daysToSkip, dateTimePickerController.theme); return GestureDetector( onTap: isDisabled( @@ -76,6 +75,8 @@ class MonthDateTimePicker extends StatelessWidget { addedIndex + 1 - daysToSkip, ); + timeOfDay = const TimeOfDay(hour: 0, minute: 0); + if (dateTimePickerController.pickTime) { timeOfDay = await displayTimePicker( context, dateTimePickerController); @@ -84,15 +85,35 @@ class MonthDateTimePicker extends StatelessWidget { if (timeOfDay != null && timeOfDay.timeContainedIn( dateTimePickerController.disabledTimes ?? [])) { - } else { - timeOfDay = const TimeOfDay(hour: 0, minute: 0); + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Verkeerde tijd gekozen'), + content: SingleChildScrollView( + child: ListBody( + children: const [ + Text( + 'De tijd die u wilt kiezen, is niet mogelijk, maak een andere keuze.'), + ], + ), + ), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + ); } DateTime selectedDateTime = DateTime( selectedDate.year, selectedDate.month, selectedDate.day, - timeOfDay.hour, + timeOfDay!.hour, timeOfDay.minute, ); @@ -102,7 +123,7 @@ class MonthDateTimePicker extends StatelessWidget { margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 5), decoration: BoxDecoration( - color: calendarColors['backgroundColor'], + color: currentDateBoxTheme.backgroundColor, borderRadius: _determineBorderRadius(dateTimePickerController), ), @@ -111,13 +132,8 @@ class MonthDateTimePicker extends StatelessWidget { child: Stack( children: [ Center( - child: Text( - (addedIndex + 1 - daysToSkip).toString(), - style: - Theme.of(context).textTheme.bodyText1!.copyWith( - color: calendarColors['textColor'], - ), - ), + child: Text((addedIndex + 1 - daysToSkip).toString(), + style: currentDateBoxTheme.textStyle), ), if (shouldMark( addedIndex, @@ -161,32 +177,39 @@ class MonthDateTimePicker extends StatelessWidget { ); } - determineColors(context, index, daysToSkip) { - Map calendarColors = { - 'backgroundColor': Colors.transparent, - 'textColor': Colors.black - }; + DateBoxCurrentTheme determineCurrentDateBoxTheme( + BuildContext context, + int index, + int daysToSkip, + DateTimePickerTheme theme, + ) { + DateBoxCurrentTheme determinedTheme = DateBoxCurrentTheme( + theme.baseTheme.backgroundColor ?? Colors.transparent, + theme.baseTheme.textStyle ?? const TextStyle(color: Colors.black), + ); if (isDisabled(index, daysToSkip)) { - calendarColors = { - 'backgroundColor': Theme.of(context).disabledColor, - 'textColor': Colors.white - }; + determinedTheme = DateBoxCurrentTheme( + theme.disabledTheme.backgroundColor ?? Theme.of(context).disabledColor, + theme.disabledTheme.textStyle ?? const TextStyle(color: Colors.white), + ); } if (isSelected(index, daysToSkip)) { - calendarColors = { - 'backgroundColor': Theme.of(context).primaryColor.withOpacity(0.3), - 'textColor': Theme.of(context).primaryColor - }; + determinedTheme = DateBoxCurrentTheme( + theme.selectedTheme.backgroundColor ?? + Theme.of(context).primaryColor.withOpacity(0.3), + theme.selectedTheme.textStyle ?? + TextStyle(color: Theme.of(context).primaryColor)); } if (shouldHighlight(index, daysToSkip)) { - calendarColors = { - 'backgroundColor': Theme.of(context).primaryColor, - 'textColor': Colors.white - }; + determinedTheme = DateBoxCurrentTheme( + theme.highlightTheme.backgroundColor ?? + Theme.of(context).primaryColor, + theme.highlightTheme.textStyle ?? + const TextStyle(color: Colors.white)); } - return calendarColors; + return determinedTheme; } bool isDisabled(int index, int daysToSkip) { @@ -228,7 +251,7 @@ class MonthDateTimePicker extends StatelessWidget { BorderRadius _determineBorderRadius( DateTimePickerController dateTimePickerController) { - switch (dateTimePickerController.dateBoxShape) { + switch (dateTimePickerController.theme.dateBoxShape) { case DateBoxShape.circle: return BorderRadius.circular(monthDateBoxSize * 2); case DateBoxShape.rectangle: @@ -239,39 +262,9 @@ class MonthDateTimePicker extends StatelessWidget { } } -class WrongTimeDialog extends StatelessWidget { - const WrongTimeDialog({required this.dateTimePickerController, Key? key}) - : super(key: key); - - final DateTimePickerController dateTimePickerController; - - @override - Widget build(BuildContext context) { - return AlertDialog( - title: const Text('Verkeerde tijd gekozen'), - content: SingleChildScrollView( - child: ListBody( - children: const [ - Text( - 'De tijd die u wilt kiezen, is niet mogelijk, maak een andere keuze.'), - ], - ), - ), - actions: [ - TextButton( - child: const Text('OK'), - onPressed: () { - displayTimePicker(context, dateTimePickerController); - }, - ), - ], - ); - } -} - displayTimePicker(BuildContext context, DateTimePickerController dateTimePickerController) async { - await showTimePicker( + return await showTimePicker( context: context, initialTime: TimeOfDay.now(), builder: (BuildContext context, Widget? child) { diff --git a/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker_sheet.dart b/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker_sheet.dart index 5c18918..af1fb05 100644 --- a/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker_sheet.dart +++ b/lib/src/widgets/month_date_time_picker.dart/month_date_time_picker_sheet.dart @@ -39,7 +39,7 @@ class MonthDateTimePickerSheet extends StatelessWidget { width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height * 0.33, child: PageView( - controller: dateTimePickerController.getPageController(), + controller: dateTimePickerController.pageController, onPageChanged: (i) { if (i == 0) { dateTimePickerController.onPageChanged( diff --git a/lib/src/widgets/week_date_time_picker/week_date_time_picker.dart b/lib/src/widgets/week_date_time_picker/week_date_time_picker.dart index f186cce..640b559 100644 --- a/lib/src/widgets/week_date_time_picker/week_date_time_picker.dart +++ b/lib/src/widgets/week_date_time_picker/week_date_time_picker.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_date_time_picker/flutter_date_time_picker.dart'; import 'package:flutter_date_time_picker/src/extensions/date_time.dart'; import 'package:flutter_date_time_picker/src/extensions/time_of_day.dart'; +import 'package:flutter_date_time_picker/src/models/date_box_current_theme.dart'; +import 'package:flutter_date_time_picker/src/models/date_time_picker_theme.dart'; import 'package:flutter_date_time_picker/src/utils/date_time_picker_controller.dart'; import 'package:intl/intl.dart'; @@ -26,12 +28,10 @@ class WeekDateTimePicker extends StatelessWidget { children: List.generate( date.daysOfWeek().length, (index) { - late Map calendarColors; + late DateBoxCurrentTheme currentDateBoxTheme; - calendarColors = determineColors( - context, - index, - ); + currentDateBoxTheme = determineCurrentDateBoxTheme( + context, index, dateTimePickerController.theme); return GestureDetector( onTap: isDisabled( index, @@ -50,18 +50,8 @@ class WeekDateTimePicker extends StatelessWidget { DateTime selectedDate = date.daysOfWeek()[index]; if (dateTimePickerController.pickTime) { - timeOfDay = await showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - builder: (BuildContext context, Widget? child) { - return MediaQuery( - data: MediaQuery.of(context).copyWith( - alwaysUse24HourFormat: - dateTimePickerController - .alwaysUse24HourFormat), - child: child!, - ); - }); + timeOfDay = await displayTimePicker( + context, dateTimePickerController); } if (timeOfDay != null && @@ -76,7 +66,7 @@ class WeekDateTimePicker extends StatelessWidget { child: ListBody( children: const [ Text( - 'De tijd die u wilt kiezen, is niet mogelijk, makke een andere keuze.'), + 'De tijd die u wilt kiezen, is niet mogelijk, maak een andere keuze.'), ], ), ), @@ -84,14 +74,14 @@ class WeekDateTimePicker extends StatelessWidget { TextButton( child: const Text('OK'), onPressed: () { - Navigator.of(context).pop(); + Navigator.pop(context); }, ), ], ); }); } else { - timeOfDay = TimeOfDay( + timeOfDay = const TimeOfDay( hour: 0, minute: 0, ); @@ -126,7 +116,7 @@ class WeekDateTimePicker extends StatelessWidget { height: weekDateBoxSize, width: weekDateBoxSize, decoration: BoxDecoration( - color: calendarColors['backgroundColor'], + color: currentDateBoxTheme.backgroundColor, borderRadius: _determineBorderRadius(dateTimePickerController), ), @@ -135,10 +125,7 @@ class WeekDateTimePicker extends StatelessWidget { Center( child: Text( date.daysOfWeek().elementAt(index).day.toString(), - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(color: calendarColors['textColor']), + style: currentDateBoxTheme.textStyle, ), ), if (shouldMark(index)) ...[ @@ -148,7 +135,9 @@ class WeekDateTimePicker extends StatelessWidget { width: weekDateBoxSize / 3, height: weekDateBoxSize / 3, decoration: BoxDecoration( - color: Theme.of(context).indicatorColor, + color: dateTimePickerController + .theme.markedIndicatorColor ?? + Theme.of(context).indicatorColor, borderRadius: BorderRadius.circular(weekDateBoxSize * 2), ), @@ -168,32 +157,38 @@ class WeekDateTimePicker extends StatelessWidget { ); } - determineColors(context, index) { - Map calendarColors = { - 'backgroundColor': Colors.transparent, - 'textColor': Colors.black - }; + DateBoxCurrentTheme determineCurrentDateBoxTheme( + BuildContext context, + int index, + DateTimePickerTheme theme, + ) { + DateBoxCurrentTheme determinedTheme = DateBoxCurrentTheme( + theme.baseTheme.backgroundColor ?? Colors.transparent, + theme.baseTheme.textStyle ?? const TextStyle(color: Colors.black), + ); if (isDisabled(index)) { - calendarColors = { - 'backgroundColor': Theme.of(context).disabledColor, - 'textColor': Colors.white - }; + determinedTheme = DateBoxCurrentTheme( + theme.disabledTheme.backgroundColor ?? Theme.of(context).disabledColor, + theme.disabledTheme.textStyle ?? const TextStyle(color: Colors.white), + ); } if (isSelected(index)) { - calendarColors = { - 'backgroundColor': Theme.of(context).primaryColor.withOpacity(0.3), - 'textColor': Theme.of(context).primaryColor - }; + determinedTheme = DateBoxCurrentTheme( + theme.selectedTheme.backgroundColor ?? + Theme.of(context).primaryColor.withOpacity(0.3), + theme.selectedTheme.textStyle ?? + TextStyle(color: Theme.of(context).primaryColor)); } if (shouldHighlight(index)) { - calendarColors = { - 'backgroundColor': Theme.of(context).primaryColor, - 'textColor': Colors.white - }; + determinedTheme = DateBoxCurrentTheme( + theme.highlightTheme.backgroundColor ?? + Theme.of(context).primaryColor, + theme.highlightTheme.textStyle ?? + const TextStyle(color: Colors.white)); } - return calendarColors; + return determinedTheme; } bool shouldHighlight(int index) { @@ -232,7 +227,7 @@ class WeekDateTimePicker extends StatelessWidget { BorderRadius _determineBorderRadius( DateTimePickerController dateTimePickerController) { - switch (dateTimePickerController.dateBoxShape) { + switch (dateTimePickerController.theme.dateBoxShape) { case DateBoxShape.circle: return BorderRadius.circular(weekDateBoxSize * 2); case DateBoxShape.rectangle: @@ -241,4 +236,19 @@ class WeekDateTimePicker extends StatelessWidget { return BorderRadius.circular(weekDateBoxSize / 4.5); } } + + displayTimePicker(BuildContext context, + DateTimePickerController dateTimePickerController) async { + return await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + builder: (BuildContext context, Widget? child) { + return MediaQuery( + data: MediaQuery.of(context).copyWith( + alwaysUse24HourFormat: + dateTimePickerController.alwaysUse24HourFormat), + child: child!, + ); + }); + } } diff --git a/lib/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart b/lib/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart index e5b1f73..3e91aa1 100644 --- a/lib/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart +++ b/lib/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart @@ -55,7 +55,7 @@ class WeekDateTimePickerSheet extends StatelessWidget { width: MediaQuery.of(context).size.width, height: 60, child: PageView( - controller: dateTimePickerController.getPageController(), + controller: dateTimePickerController.pageController, onPageChanged: (i) { if (i == 0) { dateTimePickerController.onPageChanged( diff --git a/test/flutter_date_time_picker_test.dart b/test/flutter_date_time_picker_test.dart index 2670ee4..6af5ddd 100644 --- a/test/flutter_date_time_picker_test.dart +++ b/test/flutter_date_time_picker_test.dart @@ -1,12 +1,17 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_date_time_picker/flutter_date_time_picker.dart'; void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); + testWidgets('MyWidget has a title and message', (tester) async { + // Create the widget by telling the tester to build it. + await tester.pumpWidget(Scaffold( + appBar: AppBar(), + body: DateTimePicker( + pickTime: false, + child: Container(), + ), + )); }); }