FSelect<T>.search constructor
FSelect<T>.search ({
- required Map<
String, T> items, - FutureOr<
Iterable< filter(T> >- String query
- FSelectSearchFieldProperties searchFieldProperties = const FSelectSearchFieldProperties(),
- Widget contentLoadingBuilder(
- BuildContext context,
- FSelectSearchStyle style
- Widget contentErrorBuilder(
- BuildContext context,
- Object? error,
- StackTrace stackTrace
- FSelectController<
T> ? controller, - FSelectStyle style(
- FSelectStyle style
- bool autofocus = false,
- FocusNode? focusNode,
- FFieldBuilder<
FSelectStyle> builder = _fieldBuilder, - FFieldIconBuilder<
FSelectStyle> ? prefixBuilder, - FFieldIconBuilder<
FSelectStyle> ? suffixBuilder = defaultIconBuilder, - Widget? label,
- Widget? description,
- bool enabled = true,
- ValueChanged<
T?> ? onChange, - FormFieldSetter<
T> ? onSaved, - VoidCallback? onReset,
- AutovalidateMode autovalidateMode = AutovalidateMode.onUnfocus,
- String? forceErrorText,
- FormFieldValidator<
T> validator = _defaultValidator, - Widget errorBuilder(
- BuildContext context,
- String message
- String? hint,
- TextAlign textAlign = TextAlign.start,
- TextAlignVertical? textAlignVertical,
- TextDirection? textDirection,
- bool expands = false,
- MouseCursor mouseCursor = SystemMouseCursors.click,
- bool canRequestFocus = true,
- bool clearable = false,
- AlignmentGeometry anchor = AlignmentDirectional.topStart,
- AlignmentGeometry fieldAnchor = AlignmentDirectional.bottomStart,
- FPortalConstraints popoverConstraints = const FAutoWidthPortalConstraints(maxHeight: 300),
- FPortalSpacing spacing = const FPortalSpacing(4),
- Offset shift(
- Size size,
- FPortalChildBox childBox,
- FPortalBox portalBox
- Offset offset = Offset.zero,
- FPopoverHideRegion hideRegion = FPopoverHideRegion.excludeChild,
- bool autoHide = true,
- Widget contentEmptyBuilder(
- BuildContext context,
- FSelectStyle style
- ScrollController? contentScrollController,
- bool contentScrollHandles = false,
- ScrollPhysics contentPhysics = const ClampingScrollPhysics(),
- FItemDivider contentDivider = FItemDivider.none,
- T? initialValue,
- Key? key,
Creates a searchable select with dynamic content based on the given items
and search input.
The searchFieldProperties
can be used to customize the search field.
The filter
callback produces a list of items based on the search query. Defaults to returning items that start
with the query string.
The contentLoadingBuilder
is used to show a loading indicator while the search results is processed
asynchronously by filter
.
The contentErrorBuilder
is used to show an error message when filter
is asynchronous and fails.
For more control over the appearance of items, use FSelect.searchBuilder.
Contract
Each key in items
must map to a unique value. Having multiple keys map to the same value will result in
undefined behavior.
Implementation
factory FSelect.search({
required Map<String, T> items,
FutureOr<Iterable<T>> Function(String query)? filter,
FSelectSearchFieldProperties searchFieldProperties = const FSelectSearchFieldProperties(),
Widget Function(BuildContext context, FSelectSearchStyle style) contentLoadingBuilder =
FSelect.defaultContentLoadingBuilder,
Widget Function(BuildContext context, Object? error, StackTrace stackTrace)? contentErrorBuilder,
FSelectController<T>? controller,
FSelectStyle Function(FSelectStyle style)? style,
bool autofocus = false,
FocusNode? focusNode,
FFieldBuilder<FSelectStyle> builder = _fieldBuilder,
FFieldIconBuilder<FSelectStyle>? prefixBuilder,
FFieldIconBuilder<FSelectStyle>? suffixBuilder = defaultIconBuilder,
Widget? label,
Widget? description,
bool enabled = true,
ValueChanged<T?>? onChange,
FormFieldSetter<T>? onSaved,
VoidCallback? onReset,
AutovalidateMode autovalidateMode = AutovalidateMode.onUnfocus,
String? forceErrorText,
FormFieldValidator<T> validator = _defaultValidator,
Widget Function(BuildContext context, String message) errorBuilder = FFormFieldProperties.defaultErrorBuilder,
String? hint,
TextAlign textAlign = TextAlign.start,
TextAlignVertical? textAlignVertical,
TextDirection? textDirection,
bool expands = false,
MouseCursor mouseCursor = SystemMouseCursors.click,
bool canRequestFocus = true,
bool clearable = false,
AlignmentGeometry anchor = AlignmentDirectional.topStart,
AlignmentGeometry fieldAnchor = AlignmentDirectional.bottomStart,
FPortalConstraints popoverConstraints = const FAutoWidthPortalConstraints(maxHeight: 300),
FPortalSpacing spacing = const FPortalSpacing(4),
Offset Function(Size size, FPortalChildBox childBox, FPortalBox portalBox) shift = FPortalShift.flip,
Offset offset = Offset.zero,
FPopoverHideRegion hideRegion = FPopoverHideRegion.excludeChild,
bool autoHide = true,
Widget Function(BuildContext context, FSelectStyle style) contentEmptyBuilder = defaultContentEmptyBuilder,
ScrollController? contentScrollController,
bool contentScrollHandles = false,
ScrollPhysics contentPhysics = const ClampingScrollPhysics(),
FItemDivider contentDivider = FItemDivider.none,
T? initialValue,
Key? key,
}) {
final inverse = {for (final MapEntry(:key, :value) in items.entries) value: key};
return FSelect<T>.searchBuilder(
format: (value) => inverse[value]!,
filter:
filter ??
(query) => items.entries
.where((entry) => entry.key.toLowerCase().startsWith(query.toLowerCase()))
.map((entry) => entry.value)
.toList(),
contentBuilder: (context, _, values) => [
for (final value in values) FSelectItem<T>(title: Text(inverse[value]!), value: value),
],
searchFieldProperties: searchFieldProperties,
contentLoadingBuilder: contentLoadingBuilder,
contentErrorBuilder: contentErrorBuilder,
controller: controller,
style: style,
autofocus: autofocus,
focusNode: focusNode,
builder: builder,
prefixBuilder: prefixBuilder,
suffixBuilder: suffixBuilder,
label: label,
description: description,
enabled: enabled,
onChange: onChange,
onSaved: onSaved,
onReset: onReset,
autovalidateMode: autovalidateMode,
forceErrorText: forceErrorText,
validator: validator,
errorBuilder: errorBuilder,
hint: hint,
textAlign: textAlign,
textAlignVertical: textAlignVertical,
textDirection: textDirection,
expands: expands,
mouseCursor: mouseCursor,
canRequestFocus: canRequestFocus,
clearable: clearable,
anchor: anchor,
fieldAnchor: fieldAnchor,
popoverConstraints: popoverConstraints,
spacing: spacing,
shift: shift,
offset: offset,
hideRegion: hideRegion,
autoHide: autoHide,
contentEmptyBuilder: contentEmptyBuilder,
contentScrollController: contentScrollController,
contentScrollHandles: contentScrollHandles,
contentPhysics: contentPhysics,
contentDivider: contentDivider,
initialValue: initialValue,
key: key,
);
}