openOverlay method
void
openOverlay()
Implementation
void openOverlay() async {
if (isOverlayOpen) return;
_highlightedIndex = -1;
if (items.isEmpty && asyncSearchCallback != null) {
await _prefillData();
}
_scrollController = ScrollController();
_scrollController!.addListener(_onScrollListener);
// Mobile (width < 600) → bottom sheet modale. Desktop → overlay ancorato.
final isMobile =
MediaQuery.sizeOf(context).width < _mobileBreakpoint;
if (isMobile) {
_useBottomSheet = true;
isOverlayOpen = true;
notifyListeners();
_openBottomSheet();
} else {
_useBottomSheet = false;
_overlayEntry = _createOverlayEntry();
Overlay.of(context).insert(_overlayEntry!);
isOverlayOpen = true;
notifyListeners();
// shadcn ensureSelectedVisible: dopo il primo frame, scrolla all'item
// selezionato (single) così è già visibile all'apertura.
WidgetsBinding.instance.addPostFrameCallback((_) {
// Autofocus sul campo ricerca del popover (se presente).
_searchFocusNode.requestFocus();
final ctx = _selectedItemKey.currentContext;
if (ctx != null) {
Scrollable.ensureVisible(ctx,
alignment: 0.5,
duration: const Duration(milliseconds: 150),
curve: Curves.easeOut);
}
_updateScrollChevrons();
});
}
}