FlDateRangeFormField constructor

FlDateRangeFormField({
  1. Key? key,
  2. Tuple2<DateTime, DateTime>? initialValue,
  3. FormFieldSetter<Tuple2<DateTime, DateTime>>? onSaved,
  4. FormFieldValidator<Tuple2<DateTime, DateTime>>? validator,
  5. EdgeInsetsGeometry? contentPadding,
  6. AutovalidateMode? autovalidateMode,
  7. required String label,
  8. required String placeholderText,
  9. Widget? prefixIcon,
  10. bool isRequired = false,
  11. bool enabled = true,
  12. String fromText = 'From',
  13. String textSelectDate = 'Select dates',
  14. String textSelectEndDate = 'Select end date',
  15. 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),
                        ]),
                  ),
                ),
            ],
          );
        },
      );