AppBar — это виджет верхней панели экрана во Flutter, реализующий Material Design-компонент с заголовком, действиями, кнопкой навигации и вкладками. В отличие от кастомной панели на Row или Stack, AppBar предоставляет готовую архитектуру с правильной высотой 56dp (48dp в свёрнутом состоянии) и автоматической обработкой SafeArea. По данным Flutter API Reference (2026), AppBar поддерживает анимацию при прокрутке через SliverAppBar и интеграцию с Material 3 через параметр forceMaterialTransparency. В типовом мобильном приложении AppBar выполняет роль навигационного и информационного хаба, объединяя заголовок страницы, системные действия и переключение между разделами.
Главное
AppBar — это стандартный Material-компонент верхней панели, который отображается в верхней части Scaffold. Он содержит заголовок экрана, навигационную кнопку (обычно иконка «гамбургер» или стрелка «Назад») и действия — иконки, открывающие поиск, настройки или другие функции. AppBar автоматически адаптируется под платформу: на Android используется стандартный Material bottom-shadow, на iOS — более плоский дизайн с прозрачностью.
AppBar реализует интерфейс PreferredSizeWidget, что означает, что его высота фиксирована и известна до построения. По умолчанию высота AppBar составляет 56dp на Android и 44dp на iOS в портретной ориентации, с учётом SafeArea сверху. Эта особенность позволяет Scaffold заранее рассчитать доступное пространство для body, избегая перекомпоновки при отрисовке.
По данным Flutter Material Library Guide (2026), AppBar прошёл несколько итераций: в Flutter 1.x он был простым контейнером с текстом, в Flutter 2.x получил поддержку Material 3 и flexibleSpace, а в Flutter 3.x — интеграцию с System UI (цвет строки состояния, прозрачность). Современный AppBar поддерживает Dynamic Color от Material You на устройствах Android 12+.
AppBar предоставляет набор параметров, управляющих каждой частью верхней панели. Понимание этих свойств позволяет гибко настраивать панель под любые дизайн-требования без создания кастомных решений.
| Свойство | Тип | Описание |
|---|---|---|
| title | Widget? | Основной заголовок панели, обычно Text с названием экрана |
| leading | Widget? | Виджет слева от заголовка (кнопка «Назад» или иконка меню) |
| actions | List<Widget>? | Список виджетов-действий справа (IconButton, PopupMenuButton) |
| bottom | PreferredSizeWidget? | Нижняя область для TabBar или кастомного виджета |
| flexibleSpace | Widget? | Фоновый виджет, анимируемый при прокрутке в SliverAppBar |
| backgroundColor | Color? | Цвет фона панели, переопределяющий цвет темы |
| elevation | double | Тень под панелью, создающая эффект поднятия над контентом |
| centerTitle | bool? | Центрирование заголовка (true — Material 3 поведение, false — Android-стиль) |
Свойство title принимает любой виджет, но чаще всего используется Text с настройкой стиля через TextStyle. Для длинных заголовков рекомендуется оборачивать title в Flexible, чтобы текст корректно обрезался при нехватке места. Свойство leading автоматически заменяется на BackButton при переходе на вложенный экран через Navigator.push, если не задано явно.
Список actions содержит виджеты, выравниваемые по правому краю AppBar. Каждый элемент должен быть не шире 48dp (стандарт Material Design). Для группировки действий используйте PopupMenuButton — это скрывает менее важные опции в выпадающее меню и соблюдает Material-рекомендации по плотности интерфейса.
AppBar поддерживает глубокую кастомизацию через свойства цвета, тени и отступы. Базовое оформление наследуется из темы приложения, но каждое свойство можно переопределить индивидуально. Рассмотрим основные сценарии настройки.
Цвет фона AppBar задаётся через backgroundColor. Если не указан, используется appBarTheme из ThemeData. В Material 3 цвет AppBar автоматически рассчитывается из ColorScheme.primary, но его можно переопределить для конкретного экрана. Для прозрачного AppBar (часто используется в профилях) установите backgroundColor: Colors.transparent с elevation: 0.
Свойство elevation управляет тенью под AppBar. Значение 0 убирает тень, создавая эффект «плоской» панели, что актуально для Material 3. Значение 4 даёт стандартную тень Material Design. Для кастомного управления тенью используйте shadowColor — цвет тени, который визуально отделяет панель от контента.
Для управления цветом текста в AppBar используйте foregroundColor. Это свойство влияет на цвет заголовка, иконок и текста в actions. При смене backgroundColor автоматически подбирается контрастный foregroundColor, но его можно задать принудительно для нестандартных дизайнов.
SliverAppBar — это расширение AppBar для использования внутри CustomScrollView, которое поддерживает анимацию при прокрутке: схлопывание (collapsing), параллакс-эффект и закрепление (pinned). В отличие от стандартного AppBar, SliverAppBar является silver-виджетом и может менять размер динамически в зависимости от позиции прокрутки.
Основные режимы SliverAppBar определяются комбинацией свойств pinned, floating и snap. В pinned-режиме панель всегда остаётся видимой в верхней части экрана. В floating-режиме она появляется при обратной прокрутке. Комбинация floating + snap создаёт поведение «липкой» панели, которая выезжает при малейшем скролле вверх, что часто используется в лентах новостей.
По данным Flutter API SliverAppBar (2026), для использования SliverAppBar необходимо заменить обычный ListView или Column на CustomScrollView с silver-виджетами. При этом Scaffold продолжает работать корректно, но свойство appBar Scaffold должно быть null — SliverAppBar размещается внутри CustomScrollView как первый sliver.
Рассмотрим пример AppBar с поиском, выпадающим меню и TabBar. Этот код демонстрирует типовую конфигурацию верхней панели в production-приложении на Flutter.
Scaffold(
appBar: AppBar(
title: const Text('Catalog'),
centerTitle: true,
leading: IconButton(
icon: const Icon(Icons.menu),
onPressed: () => Scaffold.of(context).openDrawer(),
),
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: () => showSearch(context: context, delegate: ProductSearch()),
),
PopupMenuButton<String>(
onSelected: (String value) {},
itemBuilder: (context) => [
const PopupMenuItem(value: 'settings', child: Text('Settings')),
const PopupMenuItem(value: 'about', child: Text('About App')),
],
),
],
bottom: const TabBar(
tabs: [
Tab(text: 'All'),
Tab(text: 'New'),
Tab(text: 'Popular'),
],
),
),
body: const TabBarView(
children: [
AllProductsPage(),
NewProductsPage(),
PopularProductsPage(),
],
),
)
В примере AppBar содержит центрированный заголовок, кнопку открытия Drawer слева, иконку поиска и выпадающее меню справа. TabBar в bottom позволяет переключаться между категориями товаров. Такая конфигурация покрывает большинство сценариев мобильных приложений: навигация, поиск, дополнительные опции и переключение разделов — всё в одной верхней панели.
Часто задаваемые вопросы
Высота AppBar фиксирована (56dp) и не может быть изменена напрямую. Для кастомной высоты используйте PreferredSize, обернув в него кастомный виджет нужной высоты. Альтернативно используйте SliverAppBar с collapsedHeight для гибкого управления размером в свернутом состоянии без потери функциональности стандартной панели.
Установите свойство elevation: 0 в конструкторе AppBar. Это уберёт тень и сделает панель визуально плоской, что соответствует стилистике Material 3. Для полного контроля используйте shadowColor: Colors.transparent, чтобы переопределить цвет тени без изменения elevation, если нужно сохранить z-координату.
AppBar — статичная панель фиксированной высоты, размещаемая в Scaffold.appBar. SliverAppBar — динамическая версия, используемая внутри CustomScrollView, которая может схлопываться, закрепляться и анимироваться при прокрутке. SliverAppBar предоставляет свойства collapsedHeight, expandedHeight, pinned и floating для гибкого управления поведением при скролле.
Добавьте IconButton с иконкой поиска в список actions. При нажатии можно вызвать showSearch с кастомным SearchDelegate, который откроет экран поиска с автоматической анимацией. Альтернативно — заменить title на TextField, превратив AppBar в строку поиска на месте, что удобно для каталогов и списков.
По умолчанию centerTitle равно null, и поведение зависит от платформы: на Android заголовок выравнивается по левому краю, на iOS — по центру. Явно установите centerTitle: true для принудительного центрирования на обеих платформах. Если заголовок не центрируется из-за leading, проверьте, что leading не null — его присутствие сдвигает заголовок вправо.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также