Flutter Widgets — co to je, strom widgetů a build

Autor: IT Sectr Publikováno: 2026-02-21 Doba čtení: 8 min

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 ve Flutteru: od obrazovky a tlačítka po odsazení a zarovnání; rámec nepoužívá nativní komponenty platformy.
  • StatelessWidget — widget bez měnitelného stavu; zobrazuje data předaná konstruktorem a po sestavení (build) se nemění.
  • StatefulWidget — widget s měnitelným stavem, uloženým v samostatném objektu State, který přežívá rebuildy.
  • Strom widgetů (widget tree) — hierarchie widgetů popisujících UI; Flutter jej převádí na Element Tree a Render Tree pro renderování.
  • BuildContext — kontext sestavení, poskytující přístup k pozici widgetu ve stromu, tématu, MediaQuery a InheritedWidget.

Co jsou Flutter Widgets?

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ů.

Tři stromy Flutter

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: neměnné widgety

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.

dart
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: widgety se stavem

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.

dart
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.

Strom widgetů: od Widget k RenderObject

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).

dart
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: kontext sestavení a přístup ke stromu

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: identifikace widgetu ve stromu

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í).

Katalog widgetů Flutter: Material, Cupertino, Layout

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.

KategorieKlíčové widgetyÚčel
LayoutRow, Column, Stack, Container, Expanded, FlexibleUmístění a velikosti potomků
MaterialScaffold, AppBar, Card, Drawer, FAB, TabBarUI komponenty Material Design 3
CupertinoCupertinoPageScaffold, CupertinoNavigationBar, CupertinoButtonKomponenty ve stylu iOS
PaintingOpacity, ClipRect, Transform, DecoratedBox, BackdropFilterVizuální efekty a ořezávání
AsyncFutureBuilder, StreamBuilderAsynchronní načítání dat se stavy UI
AccessibilitySemantics, MergeSemanticsSémantické značení pro čtečky obrazovky

Často kladené otázky

Čím se liší StatelessWidget od StatefulWidget?

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.

Co je BuildContext ve Flutteru?

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.

Je nutné znát Dart pro práci s Flutterem?

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.

Je Flutter pouze pro mobilní platformy?

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.

Jak Flutter zajišťuje výkon 60 FPS?

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í

  • Flutter Widgets — všechny prvky UI: od Scaffold po SizedBox; Flutter je sám kreslí na Skia/Impeller, bez použití nativních komponent.
  • StatelessWidget — widget bez stavu; build() vrací UI na základě neměnných parametrů konstruktoru.
  • StatefulWidget — widget s měnitelným stavem v State; setState() spouští rebuild UI.
  • Tři stromy Flutter: Widget (konfigurace) → Element (pozice) → Render (layout + paint); Element je znovu použit pro výkon.
  • BuildContext — pozice widgetu ve stromu; přístup k MediaQuery, Theme, Navigator, InheritedWidget.
  • Material a Cupertino — dvě sady widgetů pro Google Material Design 3 a Apple HIG.
  • Key (ValueKey, ObjectKey, UniqueKey) — identifikace widgetu při změně pořadí/počtu v seznamu.

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é