showDropdownDialog<T> static method

Future<T?> showDropdownDialog<T>({
  1. required BuildContext context,
  2. required String title,
  3. required List<T> items,
  4. required T selectedValue,
  5. required String itemBuilder(
    1. T
    ),
  6. required void onConfirm(
    1. T
    ),
  7. String? subtitle,
  8. String confirmText = 'Update',
  9. String cancelText = 'Cancel',
  10. bool dismissOnConfirm = true,
  11. List<T>? excludeItems,
})

Shows a dropdown selection dialog with confirm/cancel buttons.

Implementation

static Future<T?> showDropdownDialog<T>({
  required BuildContext context,
  required String title,
  required List<T> items,
  required T selectedValue,
  required String Function(T) itemBuilder,
  required void Function(T) onConfirm,
  String? subtitle,
  String confirmText = 'Update',
  String cancelText = 'Cancel',
  bool dismissOnConfirm = true,
  List<T>? excludeItems,
}) async {
  T currentSelection = selectedValue;
  final filteredItems = excludeItems != null
      ? items.where((item) => !excludeItems.contains(item)).toList()
      : items;

  return _showAdaptive<T>(
    context: context,
    builder: (context) => StatefulBuilder(
      builder: (context, setState) {
        return _DialogContainer(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              // Header
              _DialogHeader(title: title, subtitle: subtitle),
              const SizedBox(height: 16),

              // Dropdown
              Container(
                padding: const EdgeInsets.symmetric(horizontal: 16),
                decoration: BoxDecoration(
                  color: Colors.white.withValues(alpha: 0.05),
                  borderRadius: BorderRadius.circular(12),
                  border: Border.all(
                    color: Colors.white.withValues(alpha: 0.1),
                  ),
                ),
                child: DropdownButton<T>(
                  value: currentSelection,
                  isExpanded: true,
                  dropdownColor: AppColor.surfaceElevated,
                  underline: const SizedBox.shrink(),
                  icon: const Icon(Icons.keyboard_arrow_down_rounded),
                  style: const TextStyle(color: Colors.white, fontSize: 16),
                  items: filteredItems.map((item) {
                    return DropdownMenuItem<T>(
                      value: item,
                      child: Text(itemBuilder(item).capitalize),
                    );
                  }).toList(),
                  onChanged: (value) {
                    if (value != null) {
                      HapticFeedback.selectionClick();
                      setState(() => currentSelection = value);
                    }
                  },
                ),
              ),
              const SizedBox(height: 24),

              // Buttons
              _DialogButtons(
                confirmText: confirmText,
                cancelText: cancelText,
                onConfirm: () {
                  HapticFeedback.lightImpact();
                  onConfirm(currentSelection);
                  if (dismissOnConfirm) Sint.back(result: currentSelection);
                },
                onCancel: () => Sint.back(),
              ),
            ],
          ),
        );
      },
    ),
  );
}