FlSearchItemFormField<T> constructor

FlSearchItemFormField<T>({
  1. Key? key,
  2. required String label,
  3. required String placeholderText,
  4. ContentSelectedBuilder<T>? contentSelectedBuilder,
  5. ValueSelectorWidgetBuilder<T>? itemListBuilder,
  6. Widget? prefixIcon,
  7. FormFieldValidator<T>? validator,
  8. FormFieldSetter<T>? onSaved,
  9. AutovalidateMode? autovalidateMode,
  10. EdgeInsetsGeometry? contentPadding,
  11. bool enabled = true,
  12. T? initialValue,
  13. required OnSearch<T> onSearch,
  14. required ValueWidgetBuilder<T> itemBuilder,
  15. bool isRequired = false,
  16. required List<T> options,
})

Implementation

FlSearchItemFormField({
  super.key,
  required String label,
  required String placeholderText,
  ContentSelectedBuilder<T>? contentSelectedBuilder,
  ValueSelectorWidgetBuilder<T>? itemListBuilder,
  Widget? prefixIcon,
  FormFieldValidator<T>? validator,
  FormFieldSetter<T>? onSaved,
  AutovalidateMode? autovalidateMode,
  EdgeInsetsGeometry? contentPadding,
  bool enabled = true,
  T? initialValue,
  required this.onSearch,
  required this.itemBuilder,
  bool isRequired = false,
  required List<T> options,
}) : super(
        initialValue: initialValue,
        validator: validator,
        onSaved: onSaved,
        autovalidateMode: autovalidateMode,
        enabled: enabled,
        builder: (field) {
          final state = field as FlSearchItemFormFieldState<T>;
          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: () {
                  Navigator.push<T>(
                    state.context,
                    MaterialPageRoute(
                      builder: (context) {
                        return FlSearchPage<T>(
                          itemBuilder: itemBuilder,
                          onSearch: onSearch,
                        );
                      },
                    ),
                  ).then((value) {
                    if (value != null) {
                      state.didChange(value);
                    }
                  });
                },
                child: InputDecorator(
                  decoration: InputDecoration(
                    hintText: placeholderText,
                    contentPadding: contentPadding,
                    prefixIcon: prefixIcon,
                    suffixIcon: field.value != null
                        ? GestureDetector(
                            onTap: () {
                              field.didChange(null);
                            },
                            child: const Icon(
                                CupertinoIcons.clear_circled_solid))
                        : null,
                    enabledBorder: state.hasError
                        ? Theme.of(field.context)
                            .extension<FlFormFieldTheme>()
                            ?.inputDecorationTheme
                            .errorBorder
                        : null,
                    focusedBorder: state.hasError
                        ? Theme.of(field.context)
                            .extension<FlFormFieldTheme>()
                            ?.inputDecorationTheme
                            .focusedErrorBorder
                        : null,
                    border: state.hasError
                        ? Theme.of(field.context)
                            .extension<FlFormFieldTheme>()
                            ?.inputDecorationTheme
                            .errorBorder
                        : null,
                  ).applyDefaults(Theme.of(field.context)
                          .extension<FlFormFieldTheme>()
                          ?.inputDecorationTheme ??
                      Theme.of(field.context).inputDecorationTheme),
                  isEmpty: state.value == null,
                  child: state.value == null
                      ? null
                      : (contentSelectedBuilder != null
                          ? contentSelectedBuilder(
                              state.value as T,
                              state.context,
                            )
                          : SingleItemPickerDefaultDisplayValue(
                              data: state.value!)),
                ),
              ),
              if (state.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: state.errorText),
                        ]),
                  ),
                ),
            ],
          );
        },
      );