feat: Controller now has to be provided as parameter so the selected date can be changed from outside the widget.

This commit is contained in:
Jacques 2023-11-06 13:57:35 +01:00
parent 55ec65d59e
commit 61e2b849fa
12 changed files with 95 additions and 102 deletions

View file

@ -1,3 +1,7 @@
## 4.0.0
- Controller has to be specified given to the [DragDownDateTimePicker] so the date can be changed outside of the widget itself.
## 3.3.3 ## 3.3.3
- Added option for date box theme for marked dates and a boolean to use it - Added option for date box theme for marked dates and a boolean to use it

View file

@ -156,8 +156,12 @@ class DatePickerDemo extends StatelessWidget {
), ),
DragDownDateTimePicker( DragDownDateTimePicker(
onTimerPickerSheetChange: (value) {}, onTimerPickerSheetChange: (value) {},
controller: DateTimePickerController(
initialDate: DateTime.now(),
highlightToday: true,
alwaysUse24HourFormat: true, alwaysUse24HourFormat: true,
dateTimePickerTheme: const DateTimePickerTheme( markedDates: [DateTime.now().subtract(const Duration(days: 1))],
theme: const DateTimePickerTheme(
backgroundColor: Colors.white, backgroundColor: Colors.white,
markedIndicatorColor: Colors.red, markedIndicatorColor: Colors.red,
baseTheme: DateBoxTheme( baseTheme: DateBoxTheme(
@ -181,7 +185,7 @@ class DatePickerDemo extends StatelessWidget {
barOpacity: 1, barOpacity: 1,
), ),
), ),
markedDates: [DateTime.now().subtract(const Duration(days: 1))], ),
), ),
], ],
), ),

View file

@ -68,7 +68,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.3.2" version: "3.3.3"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:

View file

@ -5,6 +5,7 @@
library flutter_date_time_picker; library flutter_date_time_picker;
export 'src/drag_down_date_time_picker.dart' show DragDownDateTimePicker; export 'src/drag_down_date_time_picker.dart' show DragDownDateTimePicker;
export 'src/utils/date_time_picker_controller.dart';
export 'src/overlay_date_time_picker.dart' show OverlayDateTimePicker; export 'src/overlay_date_time_picker.dart' show OverlayDateTimePicker;
export 'src/models/date_constraint.dart'; export 'src/models/date_constraint.dart';
export 'src/enums/date_box_shape.dart'; export 'src/enums/date_box_shape.dart';

View file

@ -3,7 +3,7 @@
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import 'package:flutter/material.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/utils/date_time_picker_controller.dart';
import 'package:flutter_date_time_picker/src/widgets/month_date_time_picker/month_date_time_picker_sheet.dart'; import 'package:flutter_date_time_picker/src/widgets/month_date_time_picker/month_date_time_picker_sheet.dart';
import 'package:flutter_date_time_picker/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart'; import 'package:flutter_date_time_picker/src/widgets/week_date_time_picker/week_date_time_picker_sheet.dart';
@ -15,59 +15,21 @@ class DragDownDateTimePicker extends StatefulWidget {
/// Both views can be dragged sideways to show the next or previous week/month. /// Both views can be dragged sideways to show the next or previous week/month.
const DragDownDateTimePicker({ const DragDownDateTimePicker({
this.dateTimePickerTheme = const DateTimePickerTheme(), required this.controller,
this.header,
this.onTimerPickerSheetChange, this.onTimerPickerSheetChange,
this.onTapDay,
this.highlightToday = true,
this.wrongTimeDialog, this.wrongTimeDialog,
this.alwaysUse24HourFormat,
this.pickTime = false,
this.initialDate,
this.markedDates,
this.disabledDates,
this.disabledTimes,
this.child, this.child,
super.key, super.key,
}); });
final DateTimePickerController controller;
/// The child contained by the DatePicker. /// The child contained by the DatePicker.
final Widget? child; final Widget? child;
/// A [Widget] to display when the user picks a disabled time in the [TimePickerDialog] /// A [Widget] to display when the user picks a disabled time in the [TimePickerDialog]
final Widget? wrongTimeDialog; final Widget? wrongTimeDialog;
/// Visual properties for the [DragDownDateTimePicker]
final DateTimePickerTheme dateTimePickerTheme;
/// Widget shown at the top of the [DragDownDateTimePicker]
final Widget? header;
/// Callback that provides the date tapped on as a [DateTime] object.
final Function(DateTime)? onTapDay;
/// Whether the current day should be highlighted in the [DragDownDateTimePicker]
final bool highlightToday;
/// a [bool] to set de clock on [TimePickerDialog] to a fixed 24 or 12-hour format.
/// By default this gets determined by the settings on the user device.
final bool? alwaysUse24HourFormat;
/// [pickTime] is a [bool] that determines if the user is able to pick a time after picking a date using the [TimePickerDialog].
final bool pickTime;
/// indicates the starting date. Default is [DateTime.now()]
final DateTime? initialDate;
/// [markedDates] contain the dates [DateTime] that will be marked in the [DragDownDateTimePicker] by a small dot.
final List<DateTime>? markedDates;
/// a [List] of [DateTime] objects that will be disabled and cannot be interacted with whatsoever.
final List<DateTime>? disabledDates;
/// a [List] of [TimeOfDay] objects that cannot be picked in the [TimePickerDialog].
final List<TimeOfDay>? disabledTimes;
/// Function that gets called when the view changes from week to month or vice versa. /// Function that gets called when the view changes from week to month or vice versa.
/// The value is the amount of scrolledpixels. /// The value is the amount of scrolledpixels.
final Function(double)? onTimerPickerSheetChange; final Function(double)? onTimerPickerSheetChange;
@ -77,7 +39,8 @@ class DragDownDateTimePicker extends StatefulWidget {
} }
class _DragDownDateTimePickerState extends State<DragDownDateTimePicker> { class _DragDownDateTimePickerState extends State<DragDownDateTimePicker> {
late DateTimePickerController _dateTimePickerController; late final DateTimePickerController _dateTimePickerController =
widget.controller;
final DraggableScrollableController _dragController = final DraggableScrollableController _dragController =
DraggableScrollableController(); DraggableScrollableController();
@ -87,20 +50,6 @@ class _DragDownDateTimePickerState extends State<DragDownDateTimePicker> {
super.initState(); super.initState();
initializeDateFormatting(); initializeDateFormatting();
_dateTimePickerController = DateTimePickerController(
highlightToday: widget.highlightToday,
alwaysUse24HourFormat: widget.alwaysUse24HourFormat,
pickTime: widget.pickTime,
theme: widget.dateTimePickerTheme,
header: widget.header,
markedDates: widget.markedDates,
disabledDates: widget.disabledDates,
disabledTimes: widget.disabledTimes,
onTapDayCallBack: widget.onTapDay,
browsingDate: widget.initialDate ?? DateTime.now(),
selectedDate: widget.initialDate ?? DateTime.now(),
);
_dateTimePickerController.addListener(() { _dateTimePickerController.addListener(() {
setState(() {}); setState(() {});
}); });
@ -166,16 +115,16 @@ class _DragDownDateTimePickerState extends State<DragDownDateTimePicker> {
? WeekDateTimePickerSheet( ? WeekDateTimePickerSheet(
dateTimePickerController: dateTimePickerController:
_dateTimePickerController, _dateTimePickerController,
weekDateBoxSize: widget weekDateBoxSize:
.dateTimePickerTheme.weekDateBoxSize, widget.controller.theme.weekDateBoxSize,
) )
: MonthDateTimePickerSheet( : MonthDateTimePickerSheet(
dateTimePickerController: dateTimePickerController:
_dateTimePickerController, _dateTimePickerController,
monthDateBoxSize: widget monthDateBoxSize:
.dateTimePickerTheme.monthDateBoxSize, widget.controller.theme.monthDateBoxSize,
monthDatePadding: widget monthDatePadding:
.dateTimePickerTheme.monthDatePadding, widget.controller.theme.monthDatePadding,
), ),
), ),
), ),

View file

@ -127,8 +127,7 @@ class _OverlayDateTimePickerState extends State<OverlayDateTimePicker> {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
}, },
browsingDate: widget.initialDate ?? DateTime.now(), initialDate: widget.initialDate ?? DateTime.now(),
selectedDate: widget.initialDate ?? DateTime.now(),
); );
} }

View file

@ -9,9 +9,8 @@ class DateTimePickerController extends ChangeNotifier {
DateTimePickerController({ DateTimePickerController({
required this.theme, required this.theme,
required this.highlightToday, required this.highlightToday,
required this.pickTime, required this.initialDate,
required this.browsingDate, this.pickTime = false,
required this.selectedDate,
this.alwaysUse24HourFormat, this.alwaysUse24HourFormat,
this.header, this.header,
this.wrongTimeDialog, this.wrongTimeDialog,
@ -19,28 +18,48 @@ class DateTimePickerController extends ChangeNotifier {
this.disabledDates, this.disabledDates,
this.disabledTimes, this.disabledTimes,
this.onTapDayCallBack, this.onTapDayCallBack,
this.onBorderScrollCallback,
}); });
final PageController _pageController = PageController(initialPage: 1); /// Whether the current day should be highlighted in the [DragDownDateTimePicker]
final bool highlightToday; final bool highlightToday;
/// a [bool] to set de clock on [TimePickerDialog] to a fixed 24 or 12-hour format.
/// By default this gets determined by the settings on the user device.
final bool? alwaysUse24HourFormat; final bool? alwaysUse24HourFormat;
/// Widget shown at the top of the [DragDownDateTimePicker]
final Widget? header; final Widget? header;
final Widget? wrongTimeDialog; final Widget? wrongTimeDialog;
/// Visual properties for the [DragDownDateTimePicker]
final DateTimePickerTheme theme; final DateTimePickerTheme theme;
/// [markedDates] contain the dates [DateTime] that will be marked in the [DragDownDateTimePicker] by a small dot.
final List<DateTime>? markedDates; final List<DateTime>? markedDates;
/// a [List] of [DateTime] objects that will be disabled and cannot be interacted with whatsoever.
final List<DateTime>? disabledDates; final List<DateTime>? disabledDates;
/// a [List] of [TimeOfDay] objects that cannot be picked in the [TimePickerDialog].
final List<TimeOfDay>? disabledTimes; final List<TimeOfDay>? disabledTimes;
/// [pickTime] is a [bool] that determines if the user is able to pick a time after picking a date using the [TimePickerDialog].
final bool pickTime; final bool pickTime;
/// Callback that provides the date tapped on as a [DateTime] object.
final Function(DateTime)? onTapDayCallBack; final Function(DateTime)? onTapDayCallBack;
DateTime browsingDate; /// Callback that provides the new date which is scroll to. If this is null the scroll feature is disabled.
DateTime selectedDate; final Function(DateTime)? onBorderScrollCallback;
final DateTime initialDate;
final PageController _pageController = PageController(initialPage: 1);
late DateTime browsingDate = initialDate;
late DateTime selectedDate = initialDate;
@override @override
void dispose() { void dispose() {
@ -74,6 +93,17 @@ class DateTimePickerController extends ChangeNotifier {
} }
} }
void onBorderScroll(DateTime date) {
browsingDate = date;
selectedDate = date;
notifyListeners();
onBorderScrollCallback?.call(
date,
);
}
PageController get pageController => _pageController; PageController get pageController => _pageController;
void setBrowsingDate(DateTime date) { void setBrowsingDate(DateTime date) {

View file

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_date_time_picker/flutter_date_time_picker.dart'; import 'package:flutter_date_time_picker/flutter_date_time_picker.dart';
import 'package:flutter_date_time_picker/src/utils/date_time_picker_controller.dart';
import 'package:flutter_date_time_picker/src/widgets/overlay_date_time_picker/overlay.dart'; import 'package:flutter_date_time_picker/src/widgets/overlay_date_time_picker/overlay.dart';
class DateTimePicker extends StatefulWidget { class DateTimePicker extends StatefulWidget {
@ -105,8 +104,7 @@ class _DateTimePickerState extends State<DateTimePicker> {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
}, },
browsingDate: widget.initialDate ?? DateTime.now(), initialDate: widget.initialDate ?? DateTime.now(),
selectedDate: widget.initialDate ?? DateTime.now(),
); );
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View file

@ -5,7 +5,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_date_time_picker/flutter_date_time_picker.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/date_time.dart';
import 'package:flutter_date_time_picker/src/utils/date_time_picker_controller.dart';
import 'package:flutter_date_time_picker/src/widgets/overlay_date_time_picker/pickable_date.dart'; import 'package:flutter_date_time_picker/src/widgets/overlay_date_time_picker/pickable_date.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View file

@ -7,7 +7,6 @@ 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/date_time.dart';
import 'package:flutter_date_time_picker/src/extensions/time_of_day.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_box_current_theme.dart';
import 'package:flutter_date_time_picker/src/utils/date_time_picker_controller.dart';
import 'package:flutter_date_time_picker/src/widgets/marked_icon.dart'; import 'package:flutter_date_time_picker/src/widgets/marked_icon.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View file

@ -1,6 +1,6 @@
name: flutter_date_time_picker name: flutter_date_time_picker
description: A Flutter package for date and time picker. description: A Flutter package for date and time picker.
version: 3.3.3 version: 4.0.0
environment: environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.0.0 <4.0.0"

View file

@ -13,7 +13,12 @@ void main() {
home: Scaffold( home: Scaffold(
appBar: AppBar(), appBar: AppBar(),
body: DragDownDateTimePicker( body: DragDownDateTimePicker(
controller: DateTimePickerController(
theme: const DateTimePickerTheme(),
highlightToday: true,
initialDate: DateTime.now(),
pickTime: false, pickTime: false,
),
child: Container(), child: Container(),
), ),
), ),
@ -27,7 +32,12 @@ void main() {
home: Scaffold( home: Scaffold(
appBar: AppBar(), appBar: AppBar(),
body: DragDownDateTimePicker( body: DragDownDateTimePicker(
controller: DateTimePickerController(
theme: const DateTimePickerTheme(),
highlightToday: true,
initialDate: DateTime.now(),
pickTime: false, pickTime: false,
),
child: Container(), child: Container(),
), ),
), ),