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 тінь знизу, на 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, що підтримує анімацію при прокруці: згортання, паралакс-ефект та закріплення. На відміну від стандартного AppBar, SliverAppBar є sliver-віджетом і може динамічно змінювати розмір залежно від позиції прокруці.
Основні режими SliverAppBar визначаються комбінацією властивостей pinned, floating та snap. У режимі pinned панель завжди залишається видимою в верхньому частині екрану. У режимі floating вона з’являється при зворотній прокруці. Комбінація floating + snap створює поведінку «липкої» панелі, що з’являється при найменшому прокруці вгору, що часто використовується в стрічках новин.
За даними Flutter API SliverAppBar (2026), для використання SliverAppBar необхідно замінити звичайний ListView або Column на CustomScrollView з sliver-віджетами. Scaffold продовжує коректно працювати, але властивість appBar в Scaffold повинна бути null — SliverAppBar розміщується всередині CustomScrollView як перший sliver.
Розглянемо приклад AppBar з пошуком, випадним меню та TabBar. Цей код демонструє типову конфігурацію верхньої панелі в продакшн-додатку на Flutter.
Scaffold(
appBar: AppBar(
title: const Text('Каталог'),
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('Налаштування')),
const PopupMenuItem(value: 'about', child: Text('Про додаток')),
],
),
],
bottom: const TabBar(
tabs: [
Tab(text: 'All'),
Tab(text: 'New'),
Tab(text: 'Popular'),
],
),
),
body: const TabBarView(
children: [
AllProductsPage(),
NewProductsPage(),
PopularProductsPage(),
],
),
)
У прикладі AppBar містить центрований заголовок, кнопку відкриття Drawer зліва, іконку пошуку та випадне меню праворуч. TabBar внизу дозволяє перемикатися між категоріями товарів. Така конфігурація охоплює більшість сценаріїв мобільних додатків: навігація, пошук, додаткові опції та перемикання розділів — все в одній верхньому панелі.
Часто задавані питання
Висота 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також