import 'package:date_field/src/field.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; /// A [FormField] that contains a [DateTimeField]. /// /// This is a convenience widget that wraps a [DateTimeField] widget in a /// [FormField]. /// /// A [Form] ancestor is not required. The [Form] simply makes it easier to /// save, reset, or validate multiple fields at once. To use without a [Form], /// pass a [GlobalKey] to the constructor and use [GlobalKey.currentState] to /// save or reset the form field. class DateTimeFormField extends FormField { DateTimeFormField({ Key? key, FormFieldSetter? onSaved, FormFieldValidator? validator, DateTime? initialValue, AutovalidateMode? autovalidateMode, bool enabled = true, bool use24hFormat = false, TextStyle? dateTextStyle, DateFormat? dateFormat, DateTime? firstDate, DateTime? lastDate, DateTime? initialDate, ValueChanged? onDateSelected, InputDecoration? decoration, DatePickerEntryMode initialEntryMode = DatePickerEntryMode.calendar, DatePickerMode initialDatePickerMode = DatePickerMode.day, DateTimeFieldPickerMode mode = DateTimeFieldPickerMode.dateAndTime, TimePickerEntryMode initialTimePickerEntryMode = TimePickerEntryMode.dial, DateTimeFormFieldController? controller, DateTimeFieldCreator fieldCreator = DateTimeField.new, }) : super( key: key, initialValue: initialValue == null && controller != null ? controller.selectedDate : initialValue, onSaved: onSaved, validator: validator, autovalidateMode: autovalidateMode, enabled: enabled, builder: (FormFieldState field) { if (controller != null) { controller.addListener(() { field.didChange(controller.selectedDate); }); } // Theme defaults are applied inside the _InputDropdown widget final InputDecoration _decorationWithThemeDefaults = decoration ?? const InputDecoration(); final InputDecoration effectiveDecoration = _decorationWithThemeDefaults.copyWith(errorText: field.errorText); void onChangedHandler(DateTime value) { if (onDateSelected != null) { onDateSelected(value); } if (controller != null) { controller.selectedDate = value; } field.didChange(value); } return fieldCreator( firstDate: firstDate, initialDate: initialDate, lastDate: lastDate, decoration: effectiveDecoration, initialDatePickerMode: initialDatePickerMode, dateFormat: dateFormat, onDateSelected: onChangedHandler, selectedDate: field.value, enabled: enabled, use24hFormat: use24hFormat, mode: mode, initialEntryMode: initialEntryMode, dateTextStyle: dateTextStyle, initialTimePickerEntryMode: initialTimePickerEntryMode, ); }, ); @override FormFieldState createState() => FormFieldState(); } class DateTimeFormFieldController extends ChangeNotifier { DateTime? _selectedDate; DateTime? get selectedDate => _selectedDate; set selectedDate(DateTime? value) { _selectedDate = value; notifyListeners(); } }