FSelect<T> constructor

FSelect<T>({
  1. required Map<String, T> items,
  2. FSelectControl<T>? control,
  3. FPopoverControl popoverControl = const .managed(),
  4. FTextFieldSizeVariant size = .md,
  5. FSelectStyleDelta style = const .context(),
  6. bool autofocus = false,
  7. FocusNode? focusNode,
  8. FFieldBuilder<FSelectStyle> builder = FTextField.defaultBuilder,
  9. FFieldIconBuilder<FTextFieldStyle>? prefixBuilder,
  10. FFieldIconBuilder<FTextFieldStyle>? suffixBuilder = defaultIconBuilder,
  11. Widget? label,
  12. Widget? description,
  13. bool enabled = true,
  14. FormFieldSetter<T>? onSaved,
  15. VoidCallback? onReset,
  16. AutovalidateMode autovalidateMode = .onUnfocus,
  17. String? forceErrorText,
  18. FormFieldValidator<T> validator = FFormFieldProperties.defaultValidator,
  19. Widget errorBuilder(
    1. BuildContext context,
    2. String message
    ) = FFormFieldProperties.defaultErrorBuilder,
  20. String? hint,
  21. TextAlign textAlign = .start,
  22. TextAlignVertical? textAlignVertical,
  23. TextDirection? textDirection,
  24. bool expands = false,
  25. MouseCursor mouseCursor = .defer,
  26. bool canRequestFocus = true,
  27. bool clearable = false,
  28. FSelectPopoverBuilder<T> popoverBuilder = FPopover.defaultPopoverBuilder,
  29. AlignmentGeometry contentAnchor = .topStart,
  30. AlignmentGeometry fieldAnchor = .bottomStart,
  31. FPortalConstraints contentConstraints = const FAutoWidthPortalConstraints(maxHeight: 300),
  32. FPortalSpacing contentSpacing = const .spacing(4),
  33. FPortalOverflow contentOverflow = .flip,
  34. bool contentUseViewPadding = true,
  35. bool contentUseViewInsets = true,
  36. Offset contentOffset = .zero,
  37. FPopoverHideRegion contentHideRegion = .excludeChild,
  38. Object? contentGroupId,
  39. bool contentCutout = true,
  40. void contentCutoutBuilder(
    1. Path path,
    2. Rect bounds
    ) = FModalBarrier.defaultCutoutBuilder,
  41. bool autoHide = true,
  42. Widget contentEmptyBuilder(
    1. BuildContext context,
    2. FSelectStyle style
    ) = defaultContentEmptyBuilder,
  43. ScrollController? contentScrollController,
  44. bool contentScrollHandles = false,
  45. ScrollPhysics contentPhysics = const ClampingScrollPhysics(),
  46. FItemDivider contentDivider = .none,
  47. Key? formFieldKey,
  48. Key? key,
})

Creates a FSelect from the given items.

For more control over the appearance of items, use FSelect.rich.

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({
  required Map<String, T> items,
  FSelectControl<T>? control,
  FPopoverControl popoverControl = const .managed(),
  FTextFieldSizeVariant size = .md,
  FSelectStyleDelta style = const .context(),
  bool autofocus = false,
  FocusNode? focusNode,
  FFieldBuilder<FSelectStyle> builder = FTextField.defaultBuilder,
  FFieldIconBuilder<FTextFieldStyle>? prefixBuilder,
  FFieldIconBuilder<FTextFieldStyle>? suffixBuilder = defaultIconBuilder,
  Widget? label,
  Widget? description,
  bool enabled = true,
  FormFieldSetter<T>? onSaved,
  VoidCallback? onReset,
  AutovalidateMode autovalidateMode = .onUnfocus,
  String? forceErrorText,
  FormFieldValidator<T> validator = FFormFieldProperties.defaultValidator,
  Widget Function(BuildContext context, String message) errorBuilder = FFormFieldProperties.defaultErrorBuilder,
  String? hint,
  TextAlign textAlign = .start,
  TextAlignVertical? textAlignVertical,
  TextDirection? textDirection,
  bool expands = false,
  MouseCursor mouseCursor = .defer,
  bool canRequestFocus = true,
  bool clearable = false,
  FSelectPopoverBuilder<T> popoverBuilder = FPopover.defaultPopoverBuilder,
  AlignmentGeometry contentAnchor = .topStart,
  AlignmentGeometry fieldAnchor = .bottomStart,
  FPortalConstraints contentConstraints = const FAutoWidthPortalConstraints(maxHeight: 300),
  FPortalSpacing contentSpacing = const .spacing(4),
  FPortalOverflow contentOverflow = .flip,
  bool contentUseViewPadding = true,
  bool contentUseViewInsets = true,
  Offset contentOffset = .zero,
  FPopoverHideRegion contentHideRegion = .excludeChild,
  Object? contentGroupId,
  bool contentCutout = true,
  void Function(Path path, Rect bounds) contentCutoutBuilder = FModalBarrier.defaultCutoutBuilder,
  bool autoHide = true,
  Widget Function(BuildContext context, FSelectStyle style) contentEmptyBuilder = defaultContentEmptyBuilder,
  ScrollController? contentScrollController,
  bool contentScrollHandles = false,
  ScrollPhysics contentPhysics = const ClampingScrollPhysics(),
  FItemDivider contentDivider = .none,
  Key? formFieldKey,
  Key? key,
}) {
  final inverse = {for (final MapEntry(:key, :value) in items.entries) value: key};
  return .rich(
    control: control,
    popoverControl: popoverControl,
    size: size,
    style: style,
    autofocus: autofocus,
    focusNode: focusNode,
    builder: builder,
    prefixBuilder: prefixBuilder,
    suffixBuilder: suffixBuilder,
    label: label,
    description: description,
    enabled: enabled,
    onSaved: onSaved,
    onReset: onReset,
    autovalidateMode: autovalidateMode,
    forceErrorText: forceErrorText,
    validator: validator,
    errorBuilder: errorBuilder,
    format: (value) => inverse[value]!,
    hint: hint,
    textAlign: textAlign,
    textAlignVertical: textAlignVertical,
    textDirection: textDirection,
    expands: expands,
    mouseCursor: mouseCursor,
    canRequestFocus: canRequestFocus,
    clearable: clearable,
    popoverBuilder: popoverBuilder,
    contentAnchor: contentAnchor,
    fieldAnchor: fieldAnchor,
    contentConstraints: contentConstraints,
    contentSpacing: contentSpacing,
    contentOverflow: contentOverflow,
    contentUseViewPadding: contentUseViewPadding,
    contentUseViewInsets: contentUseViewInsets,
    contentOffset: contentOffset,
    contentHideRegion: contentHideRegion,
    contentGroupId: contentGroupId,
    contentCutout: contentCutout,
    contentCutoutBuilder: contentCutoutBuilder,
    autoHide: autoHide,
    contentEmptyBuilder: contentEmptyBuilder,
    contentScrollController: contentScrollController,
    contentScrollHandles: contentScrollHandles,
    contentPhysics: contentPhysics,
    contentDivider: contentDivider,
    formFieldKey: formFieldKey,
    key: key,
    children: [for (final MapEntry(:key, :value) in items.entries) .item(title: Text(key), value: value)],
  );
}