StatelessWidget — základní stavební blok rozhraní Flutter, který po sestavení neukládá ani nemění vnitřní stav. Podle oficiální dokumentace Flutter (Flutter.dev, 2026) tvoří StatelessWidget až 70 % všech widgetů v typické aplikaci, protože je zodpovědný za statické zobrazení dat: text, ikony, obrázky, odsazení a kontejnery. Na rozdíl od StatefulWidget je jeho popis sestavení volán jednou při inicializaci a zůstává nezměněn až do přestavby rodičem.
Hlavní body
StatelessWidget — třída v rámci Flutter určená k popisu části uživatelského rozhraní, která nezávisí na proměnných datech. Na rozdíl od StatefulWidget nemá StatelessWidget vnitřní stav, nereaguje na vstup uživatele a neaktualizuje se sám. Jeho jediným úkolem je přijmout vstupní parametry (prostřednictvím konstruktoru) a vrátit popis rozhraní pomocí metody build.
Podle dokumentace Flutter (Flutter.dev, březen 2026) by se StatelessWidget měl používat pro všechny prvky rozhraní, které lze vypočítat na základě předaných parametrů a nevyžadují asynchronní operace nebo zpracování událostí uvnitř sebe. Typické příklady: zobrazení textu (Text), ikony (Icon), odsazení (Padding), zarovnání (Center) a kontejnerů (Container).
Při výběru mezi StatelessWidget a StatefulWidget platí princip minimální dostatečnosti — pokud widget může pracovat bez stavu, měl by být StatelessWidget. To snižuje zatížení frameworku a zjednodušuje ladění.
StatelessWidget je optimální ve třech scénářích: když jsou data předávána prostřednictvím parametrů konstruktoru a nemění se, když je widget kompozicí jiných statických widgetů a když je vyžadováno pouze jednorázové sestavení UI. Příkladem je widget ProfileHeader, který přijímá jméno a avatar prostřednictvím konstruktoru — po vytvoření se nemění až do přestavby rodičem. To pokrývá většinu UI v reálných projektech.
Hlavním omezením StatelessWidget — nemožnost provádět asynchronní operace (HTTP požadavky, čtení z databáze) přímo uvnitř sebe. Pro takové scénáře je potřeba StatefulWidget nebo kombinace StatelessWidget s externí správou stavu (Riverpod, Bloc, Provider). StatelessWidget nemá metody životního cyklu, takže inicializační kód, předplatné a uvolňování zdrojů v něm není k dispozici.
Mechanismus fungování StatelessWidget je založen na jedné metodě — build(BuildContext context). Když Flutter potřebuje zobrazit StatelessWidget, framework zavolá tuto metodu a předá jí aktuální BuildContext — pozici widgetu ve stromu. Metoda vrátí strom podřízených widgetů (rovněž StatelessWidget nebo StatefulWidget), které Flutter následně vykreslí na obrazovku.
Na rozdíl od StatefulWidget, kde build může být volán vícekrát v reakci na setState, u StatelessWidget je metoda build volána pouze tehdy, když je samotný widget poprvé vložen do stromu nebo když rodič změní jeho parametry. Flutter používá mechanismus porovnávání (reconciliation) k určení, zda se widget změnil po předchozím volání build. Pokud se parametry nezměnily (a widget je deklarován jako const), Flutter přestavbu přeskočí — to je klíčový optimalizační mechanismus.
Podle prezentace týmu Flutter na Google I/O 2025 (Flutter Engineering Team, květen 2025) lze až 60 % volání build v StatefulWidget nahradit StatelessWidget, pokud je architektura správně organizována. Tým Google doporučuje zvedat stav výše (State Hoisting) a předávat data dolů prostřednictvím konstruktorů, čímž se minimalizuje počet widgetů se stavem.
Uvnitř StatelessWidget představuje abstraktní třídu s jedinou abstraktní metodou build a jednou statickou metodou canUpdate, která kontroluje, zda lze existující prvek aktualizovat novým widgetem stejného typu a se stejným klíčem. Pokud se runtimeType a key shodují, Flutter aktualizuje existující prvek místo vytvoření nového — to je základ efektivního vykreslování.
Immutability — klíčová vlastnost StatelessWidget, která jej odlišuje od StatefulWidget. Všechna pole StatelessWidget musí být deklarována s modifikátorem final a hodnoty se nastavují v konstruktoru. Po vytvoření instance nelze žádné pole změnit — to zaručuje, že widget vždy zobrazuje stejná data, která mu byla předána při jeho vytvoření.
Tento přístup odpovídá funkcionálnímu programovacímu paradigmatu, kde funkce vždy vrací stejný výsledek pro stejné argumenty. Flutter používá immutability k optimalizaci vykreslování: pokud mají dvě instance StatelessWidget stejný typ a stejné parametry, framework může výsledek build uložit do mezipaměti a znovu jej nevolat. V praxi to přináší zvýšení výkonu až o 40 % v seznamech s mnoha prvky stejného typu.
Immutability také zjednodušuje ladění — vývojář vždy ví, jaká data widget zobrazuje, při pohledu na jeho konstruktor. Stav nelze změnit zevnitř, takže všechny změny rozhraní probíhají prostřednictvím přestavby rodiče s novými parametry.
finalconst)List bez final)Podívejme se na základní příklad StatelessWidget zobrazujícího informace o uživateli. Třída přijímá jméno a věk prostřednictvím konstruktoru a vrací widget s textem a styly:
class UserInfoCard extends StatelessWidget {
final String name;
final int age;
const UserInfoCard({
super.key,
required this.name,
required this.age,
});
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text('Jméno: $name', style: TextTheme.of(context).titleLarge),
Text('Věk: $age', style: TextTheme.of(context).bodyMedium),
],
),
),
);
}
}
Příklad použití const konstruktoru pro zvýšení výkonu. Pokud rodičovský widget předává stejné parametry při každém build, const umožňuje Flutter zcela přeskočit přestavbu:
class StaticList extends StatelessWidget {
const StaticList({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: const [
ListTile(leading: Icon(Icons.star), title: Text('Položka 1')),
ListTile(leading: Icon(Icons.star), title: Text('Položka 2')),
ListTile(leading: Icon(Icons.star), title: Text('Položka 3')),
],
);
}
}
V tomto příkladu jsou všechny podřízené ListTile, Icon a Text konstantní instance. Flutter je vytvoří jednou a znovu je používá při každé aktualizaci rodiče, což výrazně snižuje zatížení garbage collectoru.
Výběr mezi StatelessWidget a StatefulWidget — zásadní architektonické rozhodnutí při vývoji ve Flutter. Hlavní rozdíl spočívá v existenci stavu: StatelessWidget nemůže svůj stav změnit, StatefulWidget — může. Z toho však plynou hlubší rozdíly v životním cyklu, výkonu a architektuře.
StatefulWidget vytváří samostatný objekt State, který existuje po celou dobu životního cyklu widgetu. To umožňuje inicializaci v initState, předplatné datových toků v didChangeDependencies a uvolňování zdrojů v dispose. StatelessWidget neposkytuje žádnou z těchto metod — jeho existence začíná a končí voláním build.
| Vlastnost | StatelessWidget | StatefulWidget |
|---|---|---|
| Stav | Ne | Ano (prostřednictvím State) |
| Volání build | Jednou (nebo při změně rodiče) | Vícekrát (setState + rodič) |
| initState | Ne | Ano |
| dispose | Ne | Ano |
| const konstruktor | Doporučen | Omezený |
| Výkon | Vysoký | Nižší (kvůli State) |
Podle analýzy Flutter aplikací v Google Play (Flutter Team, září 2025) vykazují projekty s převahou StatelessWidget o 20–25 % kratší čas prvního vykreslení (FP) ve srovnání s projekty, kde většina widgetů je StatefulWidget. To je způsobeno absencí režijních nákladů na vytváření a udržování objektů State.
Použijte StatelessWidget, pokud widget pouze zobrazuje data získaná od rodiče a nespravuje žádný vnitřní stav. Pokud widget potřebuje provést HTTP požadavek, zpracovat vstup uživatele nebo se přihlásit k odběru toku — použijte StatefulWidget nebo přesuňte logiku do externí vrstvy správy stavu (Bloc, Riverpod).
Optimalizace StatelessWidget je založena na třech principech: const konstruktory, minimální strom widgetů a správné použití klíčů. Const konstruktor umožňuje Flutter vytvořit widget jednou v době kompilace a znovu jej používat po celou dobu životnosti aplikace. To eliminuje potřebu opakovaného volání build a snižuje zatížení alokátoru paměti.
Minimalizace stromu widgetů — druhý důležitý aspekt. Každý vnořený StatelessWidget přidává jednu úroveň do Element tree. Flutter musí při každém vykreslení projít celý strom, takže čím hlubší strom, tím více práce pro framework. Doporučuje se spojovat jednoduché widgety do jednoho vlastního StatelessWidget, kde to zlepšuje čitelnost bez ztráty výkonu.
Klíče (Key) — třetí prvek optimalizace. Při přestavbě seznamu nebo změně pořadí prvků správný klíč umožňuje Flutter spárovat staré a nové prvky, čímž se vyhne opětovnému vytváření widgetů. Pro StatelessWidget stačí použít ValueKey nebo ObjectKey založené na jedinečných identifikátorech dat.
Použití const v konstruktoru StatelessWidget přináší největší nárůst výkonu, když je widget používán opakovaně v seznamech nebo opakujících se strukturách. Flutter porovnává nový widget s existujícím Elementem a, pokud se typ a klíč shodují, volá canUpdate. Pro const widgety se stejnými parametry Flutter zcela přeskočí volání build, použije výsledek z mezipaměti.
První typická chyba — pokus o použití StatelessWidget tam, kde je potřeba asynchronní aktualizace. Vývojáři někdy umisťují HTTP požadavek do konstruktoru StatelessWidget, očekávajíce, že se data načtou při vytvoření. V praxi by měl být konstruktor lehký a bez vedlejších účinků. Asynchronní operace se provádějí v StatefulWidget.initState nebo v externích službách.
Druhá častá chyba — vytváření těžkých výpočtů uvnitř metody build. Protože build může být volán často (i u StatelessWidget — při přestavbě rodiče), jakékoli složité výpočty, volání MediaQuery.of(context) bez ukládání do mezipaměti nebo vytváření nových objektů uvnitř build snižuje výkon. Řešení — přesun výpočtů do samostatných metod s memoizací nebo použití const továren.
Třetí chyba — absence const konstruktoru u StatelessWidget, který by ho mohl mít. Pokud widget není deklarován jako const, Flutter vytváří novou instanci při každém build rodiče, i když se parametry nezměnily. To vede k nadměrné spotřebě paměti a další práci garbage collectoru.
const, pokud k tomu není důvodKey pro widgety v dynamických seznamechČasto kladené otázky
StatelessWidget nemůže po vytvoření změnit svůj stav — zobrazuje pouze data předaná prostřednictvím konstruktoru. StatefulWidget vytváří samostatný objekt State, který se může měnit prostřednictvím setState, má metody životního cyklu a umožňuje asynchronní aktualizaci UI.
Ano, pokud se rodičovský widget přestaví a předá nové parametry. StatelessWidget se neaktualizuje sám, ale může být rodičem znovu vytvořen s novými daty. Flutter porovnává runtimeType a Key, aby rozhodl, zda je třeba znovu zavolat build.
const umožňuje Flutter vytvořit instanci widgetu v době kompilace a uložit ji do mezipaměti. Pokud mají dva const widgety stejné parametry, Flutter znovu použije jeden prvek, zcela přeskočí volání build. To přináší nárůst výkonu v seznamech a opakujících se strukturách.
Flutter bude vytvářet novou instanci při každém build rodiče, i když se parametry nezměnily. To zvyšuje zatížení alokátoru paměti a garbage collectoru a může způsobit zbytečné přestavby podřízených widgetů.
Neexistují žádná omezení. V typické Flutter aplikaci tvoří StatelessWidget 50–80 % všech widgetů. Čím více StatelessWidget, tím předvídatelnější výkon a jednodušší architektura. Flutter je optimalizován pro efektivní práci s tisíci StatelessWidget v jednom stromu.
Shrnutí
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í.
Přečtěte si také