Описание проблемы
В текущей реализации интерфейса на базе shadcn_flutter выпадающие окна и селекты используют классический механизм Overlay. Это приводит к ряду критических проблем:
- Краши: возникают фатальные ошибки
InheritedNotifier crash при перестроении интерфейса.
- Потеря фокуса: меню не всегда корректно закрываются при клике вне их области (например, в редактор кода).
- Ограничения окна: выпадающие списки обрезаются границами кастомного окна
bitsdojo_window, если находятся у нижнего края.
Цель
Создать единый, кроссплатформенный и кастомный UI для выпадающих списков, который избавит проект от крашей дерева состояний. Архитектура должна базироваться на встроенном во Flutter виджете MenuAnchor, который работает независимо от слоёв Overlay.
Архитектурные требования
| Требование |
Детали |
| Локация |
Новый базовый виджет-обёртка QueryaDropdown в lib/shared/widgets/ |
| Основа |
Под капотом виджет должен строго возвращать MenuAnchor |
| Стилизация |
Дизайн через токены shadcn_flutter: цвета фона, радиусы, границы menuChildren — через Theme.of(context) |
| Позиционирование |
alignmentOffset для отступа 4–8 px под кнопкой вызова |
| Состояние |
MenuController для программного закрытия меню сразу после выбора пункта |
План реализации
Шаг 1: Создание ядра QueryaDropdown
- Разработать класс
QueryaDropdown в lib/shared/widgets/.
- Параметры: список элементов меню, контроллер, коллбэки на выбор элемента.
- Обернуть пункты меню в контейнеры, стилизованные под текущую тему (чистый тёмный UI).
Шаг 2: Навигация и фокус
Шаг 3: Интеграция в рабочие области
Фаза A — экран выбора типа БД (New Database Connection в lib/features/connections/).
Фаза B — постепенная замена селектов в панелях драйверов (lib/features/postgresql/, mysql/ и др.).
Ожидаемый результат
После выполнения задачи все дропдауны в приложении выглядят идентично и плавно на Windows, macOS и Linux. MenuAnchor гарантирует стабильность при клике вне области и при перестроении сложных слоёв.
Примечание: списки ограничены границами окна приложения; при нехватке места внизу — открытие вверх или скролл.
Acceptance criteria
Описание проблемы
В текущей реализации интерфейса на базе
shadcn_flutterвыпадающие окна и селекты используют классический механизмOverlay. Это приводит к ряду критических проблем:InheritedNotifiercrash при перестроении интерфейса.bitsdojo_window, если находятся у нижнего края.Цель
Создать единый, кроссплатформенный и кастомный UI для выпадающих списков, который избавит проект от крашей дерева состояний. Архитектура должна базироваться на встроенном во Flutter виджете
MenuAnchor, который работает независимо от слоёвOverlay.Архитектурные требования
QueryaDropdownвlib/shared/widgets/MenuAnchorshadcn_flutter: цвета фона, радиусы, границыmenuChildren— черезTheme.of(context)alignmentOffsetдля отступа 4–8 px под кнопкой вызоваMenuControllerдля программного закрытия меню сразу после выбора пунктаПлан реализации
Шаг 1: Создание ядра
QueryaDropdownQueryaDropdownвlib/shared/widgets/.Шаг 2: Навигация и фокус
Шаг 3: Интеграция в рабочие области
Фаза A — экран выбора типа БД (New Database Connection в
lib/features/connections/).Фаза B — постепенная замена селектов в панелях драйверов (
lib/features/postgresql/,mysql/и др.).Ожидаемый результат
После выполнения задачи все дропдауны в приложении выглядят идентично и плавно на Windows, macOS и Linux.
MenuAnchorгарантирует стабильность при клике вне области и при перестроении сложных слоёв.Acceptance criteria
QueryaDropdownвlib/shared/widgets/, основан наMenuAnchor+MenuControllershadcn_flutter/Theme.of(context)alignmentOffsetнастроен (4–8 px)