showItemPickerDialog<T> function

Future<T?> showItemPickerDialog<T>(
  1. BuildContext context, {
  2. required ItemChildDelegate<T> items,
  3. required ItemPickerBuilder<T> builder,
  4. ItemPickerLayout layout = const GridItemPickerLayout(),
  5. T? initialValue,
  6. BoxConstraints? constraints,
  7. required Widget title,
  8. bool? adaptiveOverlay,
})

Shows an item picker in a modal dialog.

Displays a modal dialog with items arranged according to the specified layout, allowing the user to select one item. The dialog closes when an item is selected.

Parameters:

  • context (BuildContext, required): The build context.
  • items (ItemChildDelegate<T>, required): Delegate providing items.
  • builder (ItemPickerBuilder<T>, required): Builds each item widget.
  • layout (ItemPickerLayout, default: GridItemPickerLayout()): Layout strategy.
  • initialValue (T?, optional): Initially selected item.
  • constraints (BoxConstraints?, optional): Size constraints for the dialog.
  • title (Widget, required): Dialog title widget.

Returns: A Future<T?> that completes with the selected item or null.

Example:

final icon = await showItemPickerDialog<IconData>(
  context,
  title: Text('Choose Icon'),
  items: ItemList([LucideIcons.house, LucideIcons.star, LucideIcons.settings]),
  builder: (context, icon) => Icon(icon),
);

Implementation

Future<T?> showItemPickerDialog<T>(
  BuildContext context, {
  required ItemChildDelegate<T> items,
  required ItemPickerBuilder<T> builder,
  ItemPickerLayout layout = const GridItemPickerLayout(),
  T? initialValue,
  BoxConstraints? constraints,
  required Widget title,
  bool? adaptiveOverlay,
}) {
  return showOverlay<T>(
    context,
    const DialogConfiguration(),
    builder: (context) {
      final theme = Theme.of(context);
      return ModalBackdrop(
        theme: ModalBackdropTheme(borderRadius: theme.borderRadiusXl),
        child: ModalContainer(
          borderRadius: theme.borderRadiusXl,
          padding: EdgeInsets.zero,
          child: _InternalItemPicker<T>(
            items: items,
            builder: builder,
            initialValue: initialValue,
            layout: layout,
            title: title,
            constraints: constraints,
            onChanged: (value) {
              closeOverlay(context, value);
            },
          ),
        ),
      );
    },
    adaptive: adaptiveOverlay ?? true,
  ).future;
}