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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође