Адаптивный и отзывчивый интерфейс
Отзывчивость — это когда вёрстка перестраивается вслед за размером окна. Адаптивность — когда приложение ведёт себя так, будто оно родное для платформы, на которой запущено. Это разные задачи, и как только приложение выходит за пределы телефонов, нужны обе.
Почему это важно. Обещание Flutter — одна кодовая база везде, и ломается это обещание телефонной вёрсткой, растянутой на окно десктопа: колонка кнопок шириной в две тысячи пикселей, bottom sheet на мониторе, правый клик, который ничего не делает.
Что нужно понимать
- Что здесь ограничение: размер окна, способ ввода или соглашения платформы
- Какие макеты действительно разные, а какие — один и тот же, просто перестроенный
- Чего пользователь ждёт на этой платформе, — а ждёт он не того же, что на другой
- Где решается размер: в окне или в том пространстве, которое досталось этому widget
- Что меняется, если размер окна меняют прямо во время работы приложения
Основные темы
Отзывчивость
- Breakpoints и их выбор по содержимому, а не по названиям устройств
LayoutBuilderвместоMediaQuery, когда важно пространство, выделенное родителем- Схемы перестроения: список → master-detail, стопка → две колонки рядом
- Максимальная ширина: текст во всю ширину десктопа нечитаем
- Ориентация, складные экраны и разделённый экран
Адаптивность
- Навигация: bottom bar, rail, drawer — и когда уместно каждое
- Соглашения платформы для диалогов, меню, полос прокрутки и выделения
- Ввод: наведение мыши, правый клик, сочетания клавиш, порядок обхода фокуса
- Выделение и копирование текста на десктопе и в вебе
- Плотность интерфейса и зоны нажатия, которые под мышью уменьшаются
Структура
- Общая логика и подмена только вёрстки
- Где живёт ветвление, чтобы фичи не были нашпигованы проверками размера
- Проверка нескольких размеров без четырёх скриншотов на удачу
Особенности веба
- URL, deep links и перезагрузка страницы
- Размер первой загрузки и то, на что пользователь всё это время смотрит
- Кнопки браузера «назад» и «вперёд» как полноценная навигация
Уровни
| Уровень | Как это выглядит |
|---|---|
| Junior | Избегает overflow на телефонах разного размера и обрабатывает смену ориентации. |
| Middle | Делает настоящие макеты под разные breakpoints, адаптирует навигацию, обрабатывает ввод с мыши и с клавиатуры. |
| Senior | Проектирует одну структуру, которая обслуживает любой форм-фактор: соглашения платформ соблюдены, ветвление собрано в одном месте. |
Практика
Для начала
-
Тяните окно, пока не сломается Запустите приложение на десктопе и растяните окно от узкого до широкого. Почините всё уродливое.
-
Ограничьте ширину Задайте экрану с большим количеством текста максимальную ширину содержимого и выберите её по читаемости.
-
Поддержите наведение Добавьте hover-состояния чему-нибудь интерактивному и проверьте, что курсор правильный.
Глубже
-
Master–detail Сделайте связку «список — детали», которая на телефоне разворачивается в два экрана, а на планшете в один, из одного и того же кода.
-
Адаптируйте навигацию Переключайтесь по ширине с bottom bar на rail и дальше на drawer, сохраняя состояние при переключении.
-
Дайте пройти всё с клавиатуры Выполните в своём приложении целую задачу, не трогая мышь, и почините порядок обхода фокуса.
Проверьте себя
- Как ваше приложение выглядит в окне шириной 400 пикселей и шириной 2000?
- Где вы ветвитесь по размеру — в одном месте или понемногу везде?
- Что происходит по правому клику в вашем приложении?
- Пройдёт ли человек основной сценарий одной только клавиатурой?
- Какие из ваших диалогов оказались бы неуместны на десктопе?
- Что ломается, если менять размер окна при открытом экране?
Ресурсы
- Adaptive and responsive design — официальное руководство, на удивление хорошее: оно аккуратно разводит два понятия и говорит не только о вёрстке, но и о вводе.
- Material 3: Layout — классы размеров окна и канонические макеты, с breakpoints от человека, который изучал задачу, а не слухи о новых устройствах.
- Building adaptive apps — рекомендации для больших экранов, включая схемы навигации и различия во вводе.
- Material 3: Adaptive design — разница между реакцией на размер и адаптацией к платформе, обоснованная исследованиями, а не вкусом.
- Flutter on the web — что действительно отличается, включая работу с URL и характер загрузки.