MaterialApp — е коренов уиджет във Flutter, който конфигурира Material Design за цялото приложение. Той осигурява централизирана конфигурация на маршрутизация, темизация, локализация и навигация, автоматично добавяйки в Widget Tree компоненти като Navigator, Theme и MediaQuery. Според Flutter API Reference, 2025, MaterialApp е задължителен уиджет за всяко Flutter приложение, използващо Material Design, и задава глобални настройки, достъпни в цялото дърво от уиджети.
Основни точки
MaterialApp — е уиджет-обвивка, който инициализира Material Design във Flutter приложение. Той е коренът на Widget Tree и предоставя на дъщерните уиджети достъп до системни услуги: навигация, тема, медийни заявки и локализация. Без MaterialApp приложението няма да има стандартен Material стил и няма да може да използва уиджети като Scaffold, AppBar, FloatingActionButton и BottomNavigationBar.
При използване на MaterialApp, Flutter автоматично добавя няколко ключови уиджета в корена на дървото: Navigator (стек от екрани за навигация), Theme (цветова схема и стилове), MediaQuery (информация за устройството), Localizations (локализирани низове), Directionality (посока на текста). Тези уиджети са имплементирани като InheritedWidget и са достъпни чрез BuildContext навсякъде в приложението.
Минималната конфигурация на MaterialApp изисква само параметъра home — уиджетът, показван на главния екран. Flutter автоматично обвива home в Scaffold, ако не е Scaffold, чрез механизма WidgetsBinding. При стартиране на приложението с runApp(MaterialApp(home: MyHomePage())), Flutter създава кореново Widget Tree с MaterialApp като корен.
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "My Application",
theme: ThemeData(
primarySwatch: Colors.blue,
fontFamily: "Roboto",
),
darkTheme: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
В този пример MaterialApp конфигурира основна тема (светла и тъмна), заглавие и главен екран. Параметърът title се използва за заглавие на прозореца (на десктоп) и за достъпност. Параметрите theme и darkTheme определят външния вид на приложението в различни режими.
MaterialApp приема над 30 параметъра, които се разделят на категории: настройки на Material Design, маршрутизация, темизация, локализация, поведение при грешки и настройки за конкретни платформи. Познаването на ключовите параметри позволява гъвкаво конфигуриране на приложението без писане на допълнителен код.
Параметърът title задава името на приложението за заглавието на прозореца и достъпността. color определя цвета на приложението за превключвателя на задачи на Android. debugShowCheckedModeBanner скрива банера за режим на отстраняване на грешки в версията за пускане. showPerformanceOverlay включва наслагване с информация за производителността. supportDarkTheme показва дали приложението поддържа тъмна тема.
MaterialApp предоставя параметри за конфигуриране на поведението на различни платформи: restorationScopeId за запазване на състоянието на приложението при рестартиране на Android, scrollBehavior за конфигуриране на поведението при превъртане на различни операционни системи, useMaterial3 за включване на Material 3 (Material You). Material 3 добавя динамични цветове, нови компоненти и актуализирани стилове.
| Параметър | Тип | Предназначение |
|---|---|---|
| title | String | Заглавие на прозореца на приложението |
| theme | ThemeData | Светла тема на приложението |
| darkTheme | ThemeData | Тъмна тема на приложението |
| home | Widget | Главен екран на приложението |
| routes | Map<String, WidgetBuilder> | Карта на именувани маршрути |
| locale | Locale | Принудителна локализация на приложението |
Темизация — един от основните параметри на MaterialApp. Параметърът theme приема обект ThemeData, който определя цветовата палитра, типографията, формите на компонентите и иконографията за светлата тема. Параметърът darkTheme — аналогична конфигурация за тъмната тема. Flutter автоматично превключва темата в зависимост от системните настройки на устройството.
ThemeData включва primarySwatch (основен цвят), colorScheme (разширена цветова схема Material 3), brightness (светъл или тъмен), fontFamily (шрифт по подразбиране), textTheme (стилове на текст), cardTheme, appBarTheme, buttonTheme и десетки други параметри за конфигуриране на конкретни компоненти. Използвайте colorScheme за Material 3 и primarySwatch за Material 2.
Material 3 (Material You) поддържа динамични цветове, които се извличат от тапета на устройството на Android 12+. За активиране задайте useMaterial3: true и използвайте colorScheme.fromSeed или colorScheme.fromImageProvider. Динамичните цветове автоматично генерират хармонична палитра от 5 тона: primary, secondary, tertiary, neutral и neutralVariant.
Всеки уиджет може да получи достъп до текущата тема чрез Theme.of(context). Theme.of връща ThemeData, от който могат да се получат colors, textTheme и други параметри. За абониране за промени на темата (например при превключване между светла и тъмна), използвайте контекста вътре в метода build — Flutter автоматично преизгражда уиджета при промяна на темата.
Container(
color: Theme.of(context).colorScheme.primary,
child: Text(
"Пример за тематизиран текст",
style: Theme.of(context).textTheme.headlineMedium,
),
)
В този пример Theme.of(context) получава текущата тема от най-близкия MaterialApp. Цветът на фона и стилът на текста автоматично съответстват на текущата тема (светла или тъмна). При превключване на темата Container и Text се преизграждат с нови стойности от актуализирания ThemeData.
MaterialApp интегрира Navigator — стеков навигатор, който управлява преходите между екраните. Параметрите initialRoute, routes и onGenerateRoute определят как Flutter обработва навигацията. Navigator.push и Navigator.pushReplacement позволяват програмно превключване на екрани, а Navigator.pop — връщане назад.
Параметърът routes приема Map
onGenerateRoute — е функция, която се извиква, когато маршрутът не е намерен в routes. Тя приема RouteSettings и връща MaterialPageRoute. Този подход е полезен за динамична навигация, когато маршрутите зависят от данни (например /user/42). onGenerateRoute анализира името на маршрута, извлича параметри и създава съответния екран.
За поддръжка на дълбоки връзки (deep links) използвайте параметрите onGenerateInitialRoute и onGenerateRoute заедно. Дълбоките връзки позволяват отваряне на определен екран на приложението чрез URL (например https://example.com/promo). Flutter обработва дълбоки връзки на Android (чрез intent filters) и iOS (чрез universal links) и предава пътя на onGenerateRoute.
MaterialApp(
initialRoute: "/",
routes: {
"/": (context) => const HomePage(),
"/settings": (context) => const SettingsPage(),
},
onGenerateRoute: (settings) {
if (settings.name?.startsWith("/user/") == true) {
final userId = settings.name!.split("/").last;
return MaterialPageRoute(
builder: (_) => UserPage(userId: userId),
);
}
return null;
},
)
В този пример onGenerateRoute обработва динамични маршрути във формат /user/42. Ако маршрутът не бъде намерен в статичните routes и не съответства на динамичния модел, Flutter показва страница за грешка, която може да бъде конфигурирана чрез onUnknownRoute.
MaterialApp предоставя вградена поддръжка за локализация чрез параметрите localizationsDelegates и supportedLocales. LocalizationsDelegates зареждат локализирани низове, а supportedLocales определя кои езици поддържа приложението. Flutter автоматично открива езика на устройството и зарежда съответните локализирани ресурси.
Параметърът supportedLocales приема списък от Locale, които приложението поддържа: [const Locale('en'), const Locale('ru'), const Locale('de')]. localizationsDelegates — списък от делегати, зареждащи локализирани низове. За Material Design добавете GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate и GlobalCupertinoLocalizations.delegate.
За локализация на собствени низове използвайте класа AppLocalizations, създаден чрез flutter_localizations или пакета intl. AppLocalizations предоставя статични методи за достъп до локализирани низове: AppLocalizations.of(context)!.helloMessage. MaterialApp автоматично предава Localizations на Widget Tree, правейки ги достъпни чрез контекст.
Flutter предоставя три коренови уиджета за различни платформи: MaterialApp (Material Design за Android и уеб), CupertinoApp (iOS стил) и WidgetsApp (основен уиджет без стилизиране). Изборът на коренов уиджет определя външния вид на цялото приложение и наличието на платформени компоненти.
MaterialApp е подходящ за повечето приложения благодарение на поддръжката на Material Design, който изглежда добре на Android, уеб и десктоп. Material Design предоставя богата библиотека от компоненти: Scaffold, AppBar, BottomNavigationBar, Drawer, SnackBar, Dialog и много други. MaterialApp също поддържа Material 3 с динамични цветове.
CupertinoApp използва Cupertino Design в съответствие с Human Interface Guidelines на Apple. Той предоставя CupertinoPageScaffold, CupertinoNavigationBar, CupertinoTabBar и други компоненти в iOS стил. Използвайте CupertinoApp за iOS приложения или приложения, следващи стила на Apple на всички платформи.
WidgetsApp — е основен коренов уиджет без стилизиране. Той добавя Navigator, MediaQuery и Localizations, но не предоставя теми или Material/Cupertino компоненти. WidgetsApp е подходящ за персонализирани дизайн системи, игри или приложения със собствено стилизиране, където Material или Cupertino са излишни.
| Коренов уиджет | Дизайн система | Кога да се използва |
|---|---|---|
| MaterialApp | Material Design (Google) | Android, уеб, десктоп, кросплатформени приложения |
| CupertinoApp | Cupertino (Apple HIG) | iOS приложения, Apple стил на всички платформи |
| WidgetsApp | Без стилизиране | Персонализиран дизайн, игри, собствени дизайн системи |
Често задавани въпроси
Не е задължителен — можете да използвате CupertinoApp за iOS стил или WidgetsApp за персонализиран дизайн. MaterialApp е задължителен, ако използвате Material уиджети: Scaffold, AppBar, FloatingActionButton и други.
Използвайте параметрите theme (светла тема) и darkTheme (тъмна тема). Flutter автоматично превключва темата в зависимост от системните настройки. За принудително превключване използвайте WidgetsBinding.instance.platformDispatcher.platformBrightness.
Да, по подразбиране useMaterial3 е false и MaterialApp използва Material 2. За включване на Material 3 задайте useMaterial3: true и използвайте colorScheme от ColorScheme.fromSeed.
Използвайте параметъра onUnknownRoute, който приема RouteSettings и връща MaterialPageRoute. Ако нито routes, нито onGenerateRoute са обработили маршрута, се извиква onUnknownRoute — върнете в него страница със съобщение за грешка.
Ако параметърът home не е зададен и няма routes, Flutter хвърля изключение при стартиране. Трябва да се зададе поне един от параметрите: home, routes с маршрут '/' или initialRoute.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също