FlDateRangeFormField constructor
FlDateRangeFormField({
- Key? key,
- Tuple2<
DateTime, DateTime> ? initialValue, - FormFieldSetter<
Tuple2< ? onSaved,DateTime, DateTime> > - FormFieldValidator<
Tuple2< ? validator,DateTime, DateTime> > - EdgeInsetsGeometry? contentPadding,
- AutovalidateMode? autovalidateMode,
- required String label,
- required String placeholderText,
- Widget? prefixIcon,
- bool isRequired = false,
- bool enabled = true,
- String fromText = 'From',
- String textSelectDate = 'Select dates',
- String textSelectEndDate = 'Select end date',
- String toText = 'To',
Implementation
FlDateRangeFormField({
super.key,
Tuple2<DateTime, DateTime>? initialValue,
FormFieldSetter<Tuple2<DateTime, DateTime>>? onSaved,
FormFieldValidator<Tuple2<DateTime, DateTime>>? validator,
EdgeInsetsGeometry? contentPadding,
AutovalidateMode? autovalidateMode,
required String label,
required String placeholderText,
Widget? prefixIcon,
bool isRequired = false,
bool enabled = true,
String fromText = 'From',
String textSelectDate = 'Select dates',
String textSelectEndDate = 'Select end date',
String toText = 'To',
}) : super(
initialValue: initialValue,
onSaved: onSaved,
validator: validator,
builder: (field) {
String valueDisplay = '';
if (field.value != null) {
valueDisplay =
'${MaterialLocalizations.of(field.context).formatMediumDate(field.value!.item1)} - ${MaterialLocalizations.of(field.context).formatMediumDate(field.value!.item2)}';
} else {
valueDisplay = '';
}
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 4),
child: RichText(
text: TextSpan(
style: Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.labelStyle,
children: [
TextSpan(text: label),
if (isRequired)
TextSpan(
text: ' *',
style: Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.labelStyle
.copyWith(color: Colors.red),
),
]),
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
showDialog<DateTimeRange>(
context: field.context,
builder: (context) {
return CalendarPopUp(
initialStartDate: field.value?.item1,
initialEndDate: field.value?.item2,
maximumDate: DateTime.now().add(
const Duration(days: 90),
),
textSelectDate: textSelectDate,
textSelectEndDate: textSelectEndDate,
fromText: fromText,
toText: toText,
minimumDate: DateTime.now(),
);
// return DateRangePickerDialog(
// firstDate: DateTime.now(),
// currentDate: DateTime.now(),
// lastDate: DateTime.now().add(
// const Duration(days: 90),
// ),
// );
},
).then((value) {
if (value != null) {
field.didChange(Tuple2(value.start, value.end));
}
});
},
child: InputDecorator(
decoration: InputDecoration(
contentPadding: contentPadding,
hintText: placeholderText,
enabledBorder: field.hasError
? Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.inputDecorationTheme
.errorBorder
: null,
focusedBorder: field.hasError
? Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.inputDecorationTheme
.focusedErrorBorder
: null,
border: field.hasError
? Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.inputDecorationTheme
.errorBorder
: null,
).applyDefaults(Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.inputDecorationTheme ??
Theme.of(field.context).inputDecorationTheme),
isEmpty: false,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: DateInfo(
icon: prefixIcon ?? SizedBox.shrink(),
hint: 'Start date',
dateTime: field.value?.item1,
)),
Container(
height: 16,
width: 2,
margin: const EdgeInsets.symmetric(horizontal: 8)
.copyWith(right: 16),
color: Theme.of(field.context).dividerColor,
),
Expanded(
child: DateInfo(
icon: prefixIcon ?? SizedBox.shrink(),
hint: 'End date',
dateTime: field.value?.item2,
)),
],
),
),
),
if (field.hasError)
Padding(
padding: EdgeInsets.only(
top: 4,
left: (Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.inputDecorationTheme
.contentPadding as EdgeInsets)
.left,
),
child: RichText(
text: TextSpan(
style: Theme.of(field.context)
.extension<FlFormFieldTheme>()
?.errorStyle,
children: [
TextSpan(text: field.errorText),
]),
),
),
],
);
},
);