Flutter Widgets — základní stavební bloky uživatelského rozhraní v rámci Google Flutter, vydaného ve stabilní verzi 1.0 v prosinci 2018. Ve Flutteru je všechno widget: od obrazovky a tlačítka po odsazení a zarovnání. Widgety tvoří strom (widget tree), který Flutter renderuje na vlastním enginu Skia/Impeller, čímž obchází nativní komponenty platformy. Podle Google I/O (2025) je Flutter používán ve více než 500 000 aplikacích v Obchodě Google Play a App Store. Architektura Flutter rozděluje widgety na StatelessWidget (neměnné) a StatefulWidget (s měnitelným stavem prostřednictvím objektu State).
Hlavní body
Flutter Widgets — všechny prvky UI v rámci Flutter, implementované jako neměnné (immutable) třídy Dart. Widget je konfigurace prvku UI: jeho velikost, barva, pozice, zpracování událostí. Na rozdíl od Androidu (XML + View) nebo iOS (Storyboard + UIView) Flutter nepoužívá nativní komponenty — vše je kresleno enginem Skia (Android/iOS/Linux) nebo Impeller (iOS/macOS) na Canvas. To zajišťuje identický vzhled na všech platformách bez platformových rozdílů. Flutter je dodáván se dvěma sadami widgetů: Material Widgets (design Google Material Design 3 pro Android/Web) a Cupertino Widgets (design Apple HIG pro iOS/macOS). Vývojář může obě sady kombinovat v jedné aplikaci. Každý widget má metodu build(), která vrací potomka widgetu nebo jejich kompozici — tak se buduje strom widgetů.
Flutter pracuje se třemi stromy: Widget Tree (konfigurace, vytvářená vývojářem), Element Tree (přiřazení widgetu k pozici ve stromu, spravované rámcem), Render Tree (objekty, které počítají layout a provádějí paint). Widget vytváří Element, který vytváří RenderObject. Element je znovu použit při změně konfigurace (rebuild) — to je optimalizační mechanismus Flutteru: pokud se typ widgetu a key shodují, Element není znovu vytvořen, pouze je aktualizována nová konfigurace. Pochopení tří stromů je klíčem k optimalizaci výkonu aplikací Flutter.
StatelessWidget — widget, který neukládá vnitřní stav. Přijímá parametry prostřednictvím konstruktoru a zobrazuje je bez možnosti změny po sestavení. StatelessWidget je ideální pro statické prvky: nadpisy, ikony, avatary, seznamy s pevnými daty. Metoda build() je volána jednou při vytvoření a při změně nadřazeného widgetu. Protože StatelessWidget nemá stav, nevyžaduje samostatný objekt State — build() je definován přímo ve třídě widgetu.
import 'package:flutter/material.dart';
class ProfileHeader extends StatelessWidget {
final String name;
final String avatarUrl;
const ProfileHeader({super.key, required this.name, required this.avatarUrl});
@override
Widget build(BuildContext context) {
return Row(
children: [
CircleAvatar(
radius: 24,
backgroundImage: NetworkImage(avatarUrl),
),
const SizedBox(width: 12),
Text(
name,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
],
);
}
}ProfileHeader — StatelessWidget přijímající name a avatarUrl prostřednictvím konstruktoru. CircleAvatar zobrazuje avatar, Text zobrazuje jméno. Widget nemůže tyto hodnoty po vytvoření změnit. Použití konstruktoru const (const ProfileHeader) umožňuje Flutteru znovu použít instanci widgetu při rebuildu rodiče — to je mikrooptimalizace doporučená pro všechny StatelessWidgety.
StatefulWidget — widget s měnitelným stavem, uloženým v samostatném objektu State. Samotný StatefulWidget je neměnný (immutable), stejně jako StatelessWidget. Měnitelná část je vyčleněna do State: State — objekt, který je vytvořen jednou a přežívá vícenásobné rebuildy widgetu. Když se stav změní (setState()), Flutter zavolá build() State a aktualizuje UI. StatefulWidget se používá pro interaktivní prvky: čítače, textová pole, zaškrtávací políčka, animace, časovače.
import 'package:flutter/material.dart';
class LikeButton extends StatefulWidget {
const LikeButton({super.key});
@override
State<LikeButton> createState() => _LikeButtonState();
}
class _LikeButtonState extends State<LikeButton> {
bool liked = false;
int count = 42;
void _toggleLike() {
setState(() {
liked = !liked;
count += liked ? 1 : -1;
});
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: _toggleLike,
child: Text(liked ? '♥ $count' : '♡ $count'),
);
}
}LikeButton — StatefulWidget s třídou State _LikeButtonState. Pole liked a count jsou stav uložený v State a neresetují se při rebuildu. setState() informuje Flutter o nutnosti přestavby UI. Flutter znovu nevytváří State při každém rebuildu rodiče — pouze při změně konfigurace (key nebo typ widgetu). V IT Sectr používáme StatelessWidget pro zobrazení a StatefulWidget pro interaktivní komponenty, dodržujeme princip minimalizace StatefulWidget na hranice mutace.
Widget Tree — hierarchická struktura widgetů popisující UI aplikace. Flutter převádí Widget Tree na Element Tree: každý Widget vytváří Element, který sleduje pozici ve stromu a spojení s RenderObject. Render Tree provádí layout (určení velikostí a pozic) a paint (kreslení). Element je klíčová optimalizační vrstva: pokud se typ widgetu a key nezměnily při rebuildu, Element je znovu použit, aktualizuje konfiguraci bez vytváření nového RenderObject. To zajišťuje výkon Flutteru při vysoké snímkové frekvenci (60/120 FPS).
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Flutter Widgety')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.flutter_dash, size: 80),
const SizedBox(height: 16),
const Text(
'Ahoj, Flutter!',
style: TextStyle(fontSize: 24),
),
],
),
),
);
}
}Strom widgetů HomeScreen: Scaffold → AppBar + Center → Column → [Icon, SizedBox, Text]. Scaffold — hlavní layout widget Material Design. Center centruje potomka Column. Column uspořádává potomky vertikálně se zarovnáním na střed (mainAxisAlignment.center). Flutter počítá layout shora dolů (constrainty jsou předávány od rodiče) a velikosti zdola nahoru (sizedByParent nebo sizing from children).
BuildContext — deskriptor pozice widgetu v Element Tree. Každá metoda build() obdrží BuildContext, prostřednictvím kterého widget může získat přístup k:MediaQuery (velikost obrazovky, orientace, hustota pixelů, bezpečná zóna), Theme (MaterialThemeData nebo CupertinoThemeData), Navigator (navigační zásobník), ScaffoldMessenger (SnackBar), InheritedWidget (předávání dat dolů stromem). BuildContext by neměl být ukládán po dokončení build() nebo používán mimo synchronní kontext — to vede k chybám jako „Scaffold.of() called with a context that does not contain a Scaffold". Místo ukládání contextu použijte widget Builder nebo vzor InheritedWidget pro přístup k datům.
Key — volitelný parametr konstruktoru každého widgetu (super.key). Key pomáhá Flutteru identifikovat widget při změně pořadí/počtu prvků v seznamu. Bez key Flutter porovnává widgety podle typu a pozice; při přidání prvku doprostřed seznamu bez key Flutter znovu použije Element pro nesprávný widget, což způsobuje chyby stavu (StatefulWidget) a animace. Používejte ValueKey (jedinečný identifikátor) pro seznamy, ObjectKey (na základě datového objektu), UniqueKey (zaručeně jedinečný při každém rebuildu — pro vynucené znovuvytvoření).
Flutter SDK (stabilní verze 3.3+, Dart 3+) obsahuje 200+ vestavěných widgetů rozdělených do kategorií: Layout (Row, Column, Stack, Container, Expanded, Flexible, Wrap, GridView, ListView, CustomScrollView), Material Design (Scaffold, AppBar, Card, Drawer, BottomNavigationBar, FloatingActionButton, TabBar, Chip, DataTable), Cupertino (CupertinoPageScaffold, CupertinoNavigationBar, CupertinoButton, CupertinoTabBar), Painting & Effects (Opacity, DecoratedBox, ClipRect, Transform, BackdropFilter, ShaderMask), Async (FutureBuilder, StreamBuilder) a Accessibility (Semantics, MergeSemantics, ExcludeSemantics). Layout widgety jsou základem každého Flutter UI: Row pro horizontální sekvence, Column pro vertikální, Stack pro překrývající se prvky, Container s BoxDecoration pro dekoraci.
| Kategorie | Klíčové widgety | Účel |
|---|---|---|
| Layout | Row, Column, Stack, Container, Expanded, Flexible | Umístění a velikosti potomků |
| Material | Scaffold, AppBar, Card, Drawer, FAB, TabBar | UI komponenty Material Design 3 |
| Cupertino | CupertinoPageScaffold, CupertinoNavigationBar, CupertinoButton | Komponenty ve stylu iOS |
| Painting | Opacity, ClipRect, Transform, DecoratedBox, BackdropFilter | Vizuální efekty a ořezávání |
| Async | FutureBuilder, StreamBuilder | Asynchronní načítání dat se stavy UI |
| Accessibility | Semantics, MergeSemantics | Sémantické značení pro čtečky obrazovky |
Často kladené otázky
StatelessWidget nemá vnitřní stav — všechna data jsou předávána konstruktorem a nemění se. StatefulWidget ukládá měnitelný stav v samostatném objektu State, který přežívá rebuildy. Změna stavu volá setState() a Flutter přestaví UI. Pro neměnné prvky použijte StatelessWidget; pro interaktivní — StatefulWidget.
BuildContext — deskriptor pozice widgetu v Element Tree, předávaný metodě build(). Prostřednictvím contextu widget přistupuje k MediaQuery, Theme, Navigator, ScaffoldMessenger a InheritedWidget. BuildContext by neměl být ukládán po dokončení build(). Pro přístup k datům použijte widget Builder nebo InheritedWidget.
Ano, Flutter používá Dart jako jediný programovací jazyk. Dart je staticky typovaný jazyk s null-safety, sound types, extension methods a pattern matching. Pro začátek stačí základy Dartu: třídy, funkce, async/await, kolekce. Dart je kompilován do nativního kódu (AOT) prostřednictvím Dart Native a do JavaScriptu (pro web) prostřednictvím Dart2JS.
Ne, Flutter podporuje šest platforem: iOS, Android, Web, macOS, Windows, Linux. Více než 90 % kódu je společných pro všechny platformy. Adaptace platforem (kamera, souborový systém) se provádějí prostřednictvím pluginů nebo platform channels. Pro desktop Flutter používá okenní obal Flutter Desktop, pro web — engine CanvasKit (WebGL) nebo HTML renderer.
Flutter dosahuje 60/120 FPS díky: vlastnímu 2D enginu (Skia/Impeller), absenci nativního bridge (na rozdíl od React Native), třem stromům (Widget → Element → Render) s opětovným použitím Elementu při nezměněném typu/key, layout algoritmu s jednosměrným průchodem (constraints down, sizes up) a RepaintBoundary pro izolaci překreslování jednotlivých zón obrazovky.
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é