showDropdownDialog<T> static method
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(),
),
],
),
);
},
),
);
}