IconDataField constructor
IconDataField({
- required Map<
String, IconData> icons, - String? labelPrefix,
- String? label,
- Widget? labelWidget,
- IconDataFieldController? controller,
- FormFieldValidator<
IconData> ? validator, - FormFieldSetter<
IconData> ? onSaved, - IconData? initialValue,
- bool enabled = true,
- AutovalidateMode autoValidateMode = AutovalidateMode.disabled,
- bool filled = false,
- Color? fillColor,
- double iconSize = 32.0,
- double maxCrossAxisExtent = 40.0,
- double mainAxisSpacing = 6.0,
- double crossAxisSpacing = 6.0,
- double height = 128.0,
- double spaceBetween = 16.0,
- InputDecoration? decoration,
- EdgeInsets padding = const EdgeInsets.all(8),
- String? hintText,
- EdgeInsets? contentPadding,
- bool showClearSelectionButton = true,
- int? sizeExtraSmall,
- int? sizeSmall,
- int? sizeMedium,
- int? sizeLarge,
- int? sizeExtraLarge,
- double? minHeight,
- Key? key,
Implementation
IconDataField({
required this.icons,
final String? labelPrefix,
final String? label,
final Widget? labelWidget,
this.controller,
final FormFieldValidator<IconData>? validator,
super.onSaved,
final IconData? initialValue,
super.enabled,
final AutovalidateMode autoValidateMode = AutovalidateMode.disabled,
final bool filled = false,
final Color? fillColor,
final double iconSize = 32.0,
final double maxCrossAxisExtent = 40.0,
final double mainAxisSpacing = 6.0,
final double crossAxisSpacing = 6.0,
final double height = 128.0,
final double spaceBetween = 16.0,
final InputDecoration? decoration,
final EdgeInsets padding = const EdgeInsets.all(8),
final String? hintText,
final EdgeInsets? contentPadding,
final bool showClearSelectionButton = true,
super.sizeExtraSmall,
super.sizeSmall,
super.sizeMedium,
super.sizeLarge,
super.sizeExtraLarge,
super.minHeight,
super.key,
}) : assert(
initialValue == null || controller == null,
'initialValue or controller must be null.',
),
assert(
label == null || labelWidget == null,
'label or labelWidget must be null.',
),
super(
initialValue: controller != null ? controller.value : initialValue,
validator: enabled ? validator : null,
autovalidateMode: autoValidateMode,
builder: (final FormFieldState<IconData> field) {
_IconDataFieldState state = field as _IconDataFieldState;
InputDecoration effectiveDecoration =
(decoration ??
InputDecoration(
border: const OutlineInputBorder(),
filled: filled,
fillColor: fillColor,
label: labelWidget,
labelText: <String?>[
labelPrefix,
label,
].nonNulls.join(' - '),
counterText: '',
hintText: hintText,
contentPadding:
contentPadding ??
const EdgeInsets.fromLTRB(12, 0, 8, 12),
))
.applyDefaults(Theme.of(field.context).inputDecorationTheme);
return Padding(
padding: padding,
child: InputDecorator(
decoration: effectiveDecoration.copyWith(
errorText: enabled ? field.errorText : null,
),
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Expanded(
child: isNull(state.value)
? Container()
: Padding(
padding: const EdgeInsets.only(
left: 8,
right: 16,
),
child: Row(
children: <Widget>[
Icon(state.value, size: iconSize),
const SizedBox(width: 16),
Chip(
label: Text(
state._effectiveController.name,
),
),
if (showClearSelectionButton)
const SizedBox(width: 8),
if (showClearSelectionButton)
IconButton(
icon: const Icon(
FontAwesomeIcons.xmark,
),
onPressed: () =>
state.didChange(null),
),
],
),
),
),
AnimatedSearch(controller: state._textController),
],
),
),
Padding(
padding: EdgeInsets.only(top: spaceBetween),
child: SizedBox(
height: height,
child: Scrollbar(
controller: state._scrollController,
child: GridView.builder(
controller: state._scrollController,
gridDelegate:
SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: maxCrossAxisExtent,
mainAxisSpacing: mainAxisSpacing,
crossAxisSpacing: crossAxisSpacing,
),
itemCount: state.names.length,
itemBuilder:
(final BuildContext context, final int index) {
IconData iconData = state
._effectiveController
.icons[state.names[index]]!;
return GestureDetector(
onTap: () => state.didChange(iconData),
child: Icon(iconData, size: iconSize),
);
},
),
),
),
),
],
),
),
);
},
);