MaterialApp — co to je, konfigurace a role kořenového widgetu

Autor: IT Sectr Publikováno: 2026-07-02 Doba čtení: 9 min

MaterialApp — je kořenový widget ve Flutteru, který konfiguruje Material Design pro celou aplikaci. Poskytuje centralizovanou konfiguraci routování, témat, lokalizace a navigace, automaticky přidává do Widget Tree komponenty jako Navigator, Theme a MediaQuery. Podle Flutter API Reference, 2025 je MaterialApp povinným widgetem pro každou Flutter aplikaci používající Material Design a nastavuje globální parametry dostupné v celém stromu widgetů.

Hlavní body

  • MaterialApp — kořenový widget konfigurující Material Design, routování a témata Flutter aplikace.
  • Témata pomocí parametrů theme a darkTheme určují barevné schéma, fonty a styly celé aplikace.
  • Routování pomocí routes a onGenerateRoute zajišťuje navigaci mezi obrazovkami aplikace.
  • Lokalizace pomocí localizationsDelegates a supportedLocales přidává podporu pro více jazyků.
  • Vnořené InheritedWidget — MaterialApp automaticky přidává Theme, MediaQuery, Navigator a Localizations do stromu.

Co je MaterialApp ve Flutteru?

MaterialApp — je obalový widget, který inicializuje Material Design ve Flutter aplikaci. Je kořenem Widget Tree a poskytuje podřízeným widgetům přístup k systémovým službám: navigaci, tématům, mediálním dotazům a lokalizaci. Bez MaterialApp aplikace nebude mít standardní Material styl a nebude moci používat widgety jako Scaffold, AppBar, FloatingActionButton a BottomNavigationBar.

Co MaterialApp přidává do Widget Tree

Při použití MaterialApp Flutter automaticky přidá několik klíčových widgetů do kořene stromu: Navigator (zásobník obrazovek pro navigaci), Theme (barevné schéma a styly), MediaQuery (informace o zařízení), Localizations (lokalizované řetězce), Directionality (směr textu). Tyto widgety jsou implementovány jako InheritedWidget a jsou přístupné přes BuildContext kdekoli v aplikaci.

Základní použití

Minimální konfigurace MaterialApp vyžaduje pouze parametr home — widget zobrazený na hlavní obrazovce. Flutter automaticky zabalí home do Scaffold, pokud není Scaffold, přes mechanismus WidgetsBinding. Při spuštění aplikace s runApp(MaterialApp(home: MyHomePage())) Flutter vytvoří kořenové Widget Tree s MaterialApp jako kořenem.

dart
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(),
    );
  }
}

V tomto příkladu MaterialApp konfiguruje základní téma (světlé a tmavé), název a hlavní obrazovku. Parametr title se používá pro název okna (na desktopu) a pro přístupnost. Parametry theme a darkTheme určují vzhled aplikace v různých režimech.

Struktura a parametry MaterialApp

MaterialApp přijímá více než 30 parametrů, které se dělí do kategorií: nastavení Material Design, routování, témata, lokalizace, chování při chybách a nastavení pro specifické platformy. Znalost klíčových parametrů umožňuje flexibilní konfiguraci aplikace bez psaní dalšího kódu.

Hlavní konfigurační parametry

Parametr title nastavuje název aplikace pro název okna a přístupnost. color určuje barvu aplikace pro přepínač úloh na Androidu. debugShowCheckedModeBanner skrývá banner režimu ladění v release sestavení. showPerformanceOverlay zapíná překryv s informacemi o výkonu. supportDarkTheme indikuje, zda aplikace podporuje tmavé téma.

Parametry pro specifické platformy

MaterialApp poskytuje parametry pro konfiguraci chování na různých platformách: restorationScopeId pro ukládání stavu aplikace při restartu na Androidu, scrollBehavior pro konfiguraci chování posouvání na různých operačních systémech, useMaterial3 pro zapnutí Material 3 (Material You). Material 3 přidává dynamické barvy, nové komponenty a aktualizované styly.

ParametrTypÚčel
titleStringNázev okna aplikace
themeThemeDataSvětlé téma aplikace
darkThemeThemeDataTmavé téma aplikace
homeWidgetHlavní obrazovka aplikace
routesMap<String, WidgetBuilder>Mapa pojmenovaných cest
localeLocaleVynucená lokalizace aplikace

Témata pomocí theme a darkTheme

Témata — jeden z hlavních parametrů MaterialApp. Parametr theme přijímá objekt ThemeData, který určuje barevnou paletu, typografii, tvary komponent a ikonografii pro světlé téma. Parametr darkTheme — analogická konfigurace pro tmavé téma. Flutter automaticky přepíná téma v závislosti na systémových nastaveních zařízení.

ThemeData: barevné schéma

ThemeData zahrnuje primarySwatch (hlavní barva), colorScheme (rozšířené barevné schéma Material 3), brightness (světlý nebo tmavý), fontFamily (výchozí font), textTheme (styly textu), cardTheme, appBarTheme, buttonTheme a desítky dalších parametrů pro konfiguraci specifických komponent. Používejte colorScheme pro Material 3 a primarySwatch pro Material 2.

Dynamické barvy Material 3

Material 3 (Material You) podporuje dynamické barvy, které jsou extrahovány z tapety zařízení na Android 12+. Pro zapnutí nastavte useMaterial3: true a používejte colorScheme.fromSeed nebo colorScheme.fromImageProvider. Dynamické barvy automaticky generují harmonickou paletu z 5 tónů: primary, secondary, tertiary, neutral a neutralVariant.

Přístup k tématu ve widgetech

Jakýkoli widget může získat přístup k aktuálnímu tématu přes Theme.of(context). Theme.of vrací ThemeData, ze kterého lze získat colors, textTheme a další parametry. Pro sledování změn tématu (například při přepínání mezi světlým a tmavým) používejte kontext uvnitř metody build — Flutter automaticky znovu sestaví widget při změně tématu.

dart
Container(
  color: Theme.of(context).colorScheme.primary,
  child: Text(
    "Příklad tématického textu",
    style: Theme.of(context).textTheme.headlineMedium,
  ),
)

V tomto příkladu Theme.of(context) získává aktuální téma z nejbližšího MaterialApp. Barva pozadí a styl textu automaticky odpovídají aktuálnímu tématu (světlému nebo tmavému). Při přepnutí tématu se Container a Text znovu sestaví s novými hodnotami z aktualizovaného ThemeData.

Routování a navigace v MaterialApp

MaterialApp integruje Navigator — zásobníkový navigátor, který spravuje přechody mezi obrazovkami. Parametry initialRoute, routes a onGenerateRoute určují, jak Flutter zpracovává navigaci. Navigator.push a Navigator.pushReplacement umožňují programové přepínání obrazovek a Navigator.pop — návrat zpět.

Pojmenované cesty (routes)

Parametr routes přijímá Map, kde klíč je název cesty (řetězec) a hodnota je funkce vytvářející widget pro obrazovku. Pojmenované cesty jsou vhodné pro statickou navigaci: '/' (kořenová cesta) obvykle odpovídá home, '/settings', '/profile' — další obrazovky. Navigator.pushNamed(context, '/settings') přechází na obrazovku nastavení.

Generování cest (onGenerateRoute)

onGenerateRoute — je funkce volaná, když cesta není nalezena v routes. Přijímá RouteSettings a vrací MaterialPageRoute. Tento přístup je užitečný pro dynamickou navigaci, když cesty závisí na datech (např. /user/42). onGenerateRoute analyzuje název cesty, extrahuje parametry a vytvoří odpovídající obrazovku.

Hluboké odkazy a pojmenované routování

Pro podporu hlubokých odkazů (deep links) používejte parametry onGenerateInitialRoute a onGenerateRoute společně. Hluboké odkazy umožňují otevřít určitou obrazovku aplikace pomocí URL (např. https://example.com/promo). Flutter zpracovává hluboké odkazy na Androidu (přes intent filters) a iOS (přes universal links) a předává cestu do onGenerateRoute.

dart
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;
  },
)

V tomto příkladu onGenerateRoute zpracovává dynamické cesty ve formátu /user/42. Pokud cesta není nalezena ve statických routes a neodpovídá dynamickému vzoru, Flutter zobrazí chybovou stránku, kterou lze nakonfigurovat pomocí onUnknownRoute.

Lokalizace a internacionalizace

MaterialApp poskytuje vestavěnou podporu pro lokalizaci pomocí parametrů localizationsDelegates a supportedLocales. LocalizationsDelegates načítají lokalizované řetězce a supportedLocales určuje, které jazyky aplikace podporuje. Flutter automaticky detekuje jazyk zařízení a načítá odpovídající lokalizované zdroje.

Konfigurace supportedLocales a localizationsDelegates

Parametr supportedLocales přijímá seznam Locale, které aplikace podporuje: [const Locale('en'), const Locale('ru'), const Locale('de')]. localizationsDelegates — seznam delegátů načítajících lokalizované řetězce. Pro Material Design přidejte GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate a GlobalCupertinoLocalizations.delegate.

Lokalizace řetězců aplikace

Pro lokalizaci vlastních řetězců použijte třídu AppLocalizations vytvořenou pomocí flutter_localizations nebo balíčku intl. AppLocalizations poskytuje statické metody pro přístup k lokalizovaným řetězcům: AppLocalizations.of(context)!.helloMessage. MaterialApp automaticky předává Localizations do Widget Tree, čímž je zpřístupňuje přes kontext.

  • flutter_localizations — oficiální balíček pro lokalizaci Material widgetů a systémových řetězců.
  • intl — balíček pro internacionalizaci: formátování čísel, dat, měn a pluralizace.
  • SOUBORY ARB — formát ukládání lokalizovaných řetězců používaný flutter_localizations a intl.

MaterialApp vs CupertinoApp vs WidgetsApp

Flutter poskytuje tři kořenové widgety pro různé platformy: MaterialApp (Material Design pro Android a web), CupertinoApp (styl iOS) a WidgetsApp (základní widget bez stylování). Výběr kořenového widgetu určuje vzhled celé aplikace a dostupnost komponent platformy.

MaterialApp: univerzální volba

MaterialApp je vhodný pro většinu aplikací díky podpoře Material Design, který vypadá dobře na Androidu, webu a desktopu. Material Design poskytuje bohatou knihovnu komponent: Scaffold, AppBar, BottomNavigationBar, Drawer, SnackBar, Dialog a mnoho dalších. MaterialApp také podporuje Material 3 s dynamickými barvami.

CupertinoApp: styl iOS

CupertinoApp používá Cupertino Design podle Human Interface Guidelines od Apple. Poskytuje CupertinoPageScaffold, CupertinoNavigationBar, CupertinoTabBar a další komponenty ve stylu iOS. Použijte CupertinoApp pro iOS aplikace nebo aplikace dodržující styl Apple na všech platformách.

WidgetsApp: minimální kořen

WidgetsApp — je základní kořenový widget bez stylování. Přidává Navigator, MediaQuery a Localizations, ale neposkytuje témata nebo Material/Cupertino komponenty. WidgetsApp je vhodný pro vlastní designové systémy, hry nebo aplikace s vlastním stylováním, kde je Material nebo Cupertino nadbytečný.

Kořenový widgetDesignový systémKdy použít
MaterialAppMaterial Design (Google)Android, web, desktop, cross-platform aplikace
CupertinoAppCupertino (Apple HIG)iOS aplikace, styl Apple na všech platformách
WidgetsAppBez stylováníVlastní design, hry, vlastní designové systémy

Často kladené otázky

Je MaterialApp povinný ve Flutter aplikaci?

Není povinný — můžete použít CupertinoApp pro styl iOS nebo WidgetsApp pro vlastní design. MaterialApp je povinný, pokud používáte Material widgety: Scaffold, AppBar, FloatingActionButton a další.

Jak přepnout téma v MaterialApp?

Použijte parametry theme (světlé téma) a darkTheme (tmavé téma). Flutter automaticky přepíná téma podle systémových nastavení. Pro vynucené přepnutí použijte WidgetsBinding.instance.platformDispatcher.platformBrightness.

Lze použít MaterialApp bez Material 3?

Ano, ve výchozím nastavení je useMaterial3 false a MaterialApp používá Material 2. Pro zapnutí Material 3 nastavte useMaterial3: true a použijte colorScheme z ColorScheme.fromSeed.

Jak přidat vlastní stránku chyby 404?

Použijte parametr onUnknownRoute, který přijímá RouteSettings a vrací MaterialPageRoute. Pokud ani routes ani onGenerateRoute nezpracovaly cestu, zavolá se onUnknownRoute — vraťte v něm stránku s chybovou zprávou.

Co se stane, když nezadám home v MaterialApp?

Pokud parametr home není zadán a nejsou routes, Flutter vyhodí výjimku při spuštění. Je třeba zadat alespoň jeden z parametrů: home, routes s cestou '/' nebo initialRoute.

Shrnutí

  • MaterialApp — kořenový widget Flutteru pro konfiguraci Material Design, routování, témat a lokalizace aplikace.
  • Hlavní parametry: title, theme, darkTheme, home, routes, locale a useMaterial3 pro Material 3.
  • Témata pomocí ThemeData určují barvy, fonty a styly dostupné přes Theme.of(context) v libovolném widgetu.
  • Routování pomocí routes (statické cesty) a onGenerateRoute (dynamické) poskytuje flexibilní navigaci.
  • Lokalizace pomocí supportedLocales a localizationsDelegates přidává podporu pro více jazyků.
  • MaterialApp automaticky vkládá Navigator, Theme, MediaQuery, Localizations a Directionality do Widget Tree.
  • Alternativy: CupertinoApp (styl iOS) a WidgetsApp (vlastní design) pro aplikace bez Material Design.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také