Ответ
При разработке кроссплатформенных приложений Flutter под desktop (Windows, macOS, Linux) я использую комбинацию встроенных и сторонних инструментов для адаптивности:
-
Адаптивные виджеты на основе размера экрана
LayoutBuilder— фундаментальный виджет для создания динамического макета на основе доступных ограничений (constraints).LayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth > 1200) { return const WideDesktopLayout(); // Макет для широких мониторов } else if (constraints.maxWidth > 600) { return const DesktopLayout(); // Стандартный десктоп } else { return const MobileLayout(); // Планшет/мобильный } }, )MediaQuery— для получения точных данных об устройстве (размер экрана, плотность пикселей, ориентация).final size = MediaQuery.of(context).size; final isDesktop = size.width > 800; final isLandscape = size.width > size.height;
-
Специализированные десктопные виджеты
NavigationRail— вертикальная панель навигации, типичная для десктоп-приложений. Часто комбинируется сScaffold.body.DataTable,PaginatedDataTable— для отображения больших объемов структурированных данных.Split(из пакетаflutter_split) или кастомные реализации — для создания перемещаемых разделителей панелей.
-
Управление окном приложения
- Пакеты вроде
bitsdojo_windowилиwindow_managerпозволяют:- Задавать минимальный/максимальный размер окна.
- Создавать кастомные рамки окна (без стандартного заголовка).
- Размещать окно на определенном мониторе.
// Пример с bitsdojo_window appWindow.minSize = const Size(800, 600); appWindow.maxSize = const Size(1600, 1200); appWindow.alignment = Alignment.center;
- Пакеты вроде
-
Адаптивная навигация
- Паттерн, при котором на мобильных используется
BottomNavigationBarи полноэкранные страницы, а на десктопе —NavigationRailили меню с мастер-деталью (master-detail), где несколько "экранов" отображаются одновременно.
- Паттерн, при котором на мобильных используется
-
Пакеты для нативного вида и ощущений
fluent_ui— для стиля Windows 11.macos_uiилиyaru_widgets— для стиля macOS или Linux (Yaru) соответственно.
Ключевой подход — проектировать интерфейс не для конкретной платформы, а для размера области отображения, что делает приложение по-настоящему адаптивным.