99 lines
3.5 KiB
Dart
99 lines
3.5 KiB
Dart
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<DateTime> {
|
|
DateTimeFormField({
|
|
Key? key,
|
|
FormFieldSetter<DateTime>? onSaved,
|
|
FormFieldValidator<DateTime>? validator,
|
|
DateTime? initialValue,
|
|
AutovalidateMode? autovalidateMode,
|
|
bool enabled = true,
|
|
bool use24hFormat = false,
|
|
TextStyle? dateTextStyle,
|
|
DateFormat? dateFormat,
|
|
DateTime? firstDate,
|
|
DateTime? lastDate,
|
|
DateTime? initialDate,
|
|
ValueChanged<DateTime>? 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<DateTime> 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<DateTime> createState() => FormFieldState<DateTime>();
|
|
}
|
|
|
|
class DateTimeFormFieldController extends ChangeNotifier {
|
|
DateTime? _selectedDate;
|
|
DateTime? get selectedDate => _selectedDate;
|
|
set selectedDate(DateTime? value) {
|
|
_selectedDate = value;
|
|
notifyListeners();
|
|
}
|
|
}
|