Flutter Widgetek — mi ez, widgetfa és build

Szerző: IT Sectr Megjelenés: 2026-02-21 Olvasási idő: 8 perc

Flutter Widgetek – a Google Flutter keretrendszer felhasználói felületének alapvető építőkövei, amely stabil 1.0-s verzióban 2018 decemberében jelent meg. A Flutterben minden widget: a képernyőtől és a gombtól a térközig és az igazításig. A widgetek egy fát (widget tree) alkotnak, amelyet a Flutter a saját Skia/Impeller motorjával renderel, megkerülve a platform natív komponenseit. A Google I/O (2025) szerint a Flutter-t több mint 500 000 alkalmazás használja a Google Play-ben és az App Store-ban. A Flutter architektúrája a widgeteket StatelessWidget (változatlan) és StatefulWidget (változó állapotú, State objektumon keresztül) kategóriákra osztja.

Főbb pontok

  • Flutter Widgetek – az összes UI elem a Flutterben: a képernyőtől és a gombtól a térközig és az igazításig; a keretrendszer nem használ natív platform komponenseket.
  • StatelessWidget – widget változó állapot nélkül; a konstruktoron keresztül átadott adatokat jeleníti meg, és a build után nem változik.
  • StatefulWidget – widget változó állapottal, amely egy külön State objektumban tárolódik, és túléli a rebuild-eket.
  • Widgetfa (widget tree) – az UI-t leíró widgetek hierarchiája; a Flutter Element Tree-vé és Render Tree-vé alakítja a rendereléshez.
  • BuildContext – a build kontextus, amely hozzáférést biztosít a widget fa-beli pozíciójához, témához, MediaQuery-hez és InheritedWidget-hoz.

Mik azok a Flutter Widgetek?

Flutter Widgetek – az összes UI elem a Flutter keretrendszerben, megváltoztathatatlan (immutable) Dart osztályokként implementálva. A widget egy UI elem konfigurációja: mérete, színe, pozíciója, eseménykezelése. Az Androidtól (XML + View) vagy iOS-től (Storyboard + UIView) eltérően a Flutter nem használ natív komponenseket – mindent a Skia (Android/iOS/Linux) vagy Impeller (iOS/macOS) motor rajzol a Canvas-ra. Ez azonos megjelenést biztosít minden platformon, platformeltérések nélkül. A Flutter két widget készlettel érkezik: Material Widgets (Google Material Design 3 design Android/Web esetén) és Cupertino Widgets (Apple HIG design iOS/macOS esetén). A fejlesztő mindkét készletet kombinálhatja egy alkalmazásban. Minden widget rendelkezik egy build() metódussal, amely egy gyermek widgetet vagy azok kompozícióját adja vissza – így épül fel a widgetfa.

A Flutter három fája

A Flutter három fával működik: Widget Tree (konfiguráció, a fejlesztő hozza létre), Element Tree (a widget pozícióhoz rendelése a fában, a keretrendszer kezeli), Render Tree (objektumok, amelyek a layout-ot számítják és a paint-et végzik). A Widget létrehozza az Element-et, amely létrehozza a RenderObject-et. Az Element újrahasznosításra kerül konfigurációváltáskor (rebuild) – ez a Flutter optimalizációs mechanizmusa: ha a widget típusa és a key egyezik, az Element nem jön létre újra, csak az új konfiguráció frissül. A három fa megértése kulcs a Flutter alkalmazások teljesítményének optimalizálásához.

StatelessWidget: változatlan widgetek

StatelessWidget – olyan widget, amely nem tárol belső állapotot. A paramétereket a konstruktoron keresztül fogadja, és a build után változtatás nélkül jeleníti meg. A StatelessWidget ideális statikus elemekhez: címsorok, ikonok, avatárok, rögzített adatokat tartalmazó listák. A build() metódus egyszer kerül meghívásra a létrehozáskor és a szülő widget változásakor. Mivel a StatelessWidget-nek nincs állapota, nem igényel külön State objektumot – a build() közvetlenül a widget osztályban van definiálva.

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 – egy StatelessWidget, amely a name és avatarUrl paramétereket a konstruktoron keresztül fogadja. A CircleAvatar megjeleníti az avatárt, a Text a nevet. A widget nem változtathatja meg ezeket az értékeket a létrehozás után. A const konstruktor (const ProfileHeader) használata lehetővé teszi a Flutter számára, hogy újrahasznosítsa a widget példányát a szülő rebuild-je során – ez egy mikrooptimalizálás, amely minden StatelessWidget esetében ajánlott.

StatefulWidget: állapottal rendelkező widgetek

StatefulWidget – változó állapotú widget, amely egy külön State objektumban tárolódik. Maga a StatefulWidget megváltoztathatatlan (immutable), akárcsak a StatelessWidget. A változó rész a State-ben van elkülönítve: State – egy objektum, amely egyszer jön létre és túléli a widget többszörös rebuild-jeit. Amikor az állapot változik (setState()), a Flutter meghívja a State build() metódusát, frissítve az UI-t. A StatefulWidget interaktív elemekhez használatos: számlálók, szövegmezők, jelölőnégyzetek, animációk, időzítők.

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

A LikeButton – egy StatefulWidget a _LikeButtonState State osztállyal. A liked és count mezők a State-ben tárolt állapotok, amelyek nem állnak vissza rebuild-kor. A setState() értesíti a Flutter-t az UI újraépítésének szükségességéről. A Flutter nem hozza létre újra a State-et minden szülő rebuild-nél – csak konfigurációváltáskor (key vagy widget típus). Az IT Sectr-nél a StatelessWidget-et megjelenítésre, a StatefulWidget-et interaktív komponensekhez használjuk, követve a StatefulWidget minimalizálásának elvét a mutáció határáig.

Widgetfa: Widget-től RenderObject-ig

Widget Tree – az alkalmazás UI-ját leíró widgetek hierarchikus szerkezete. A Flutter a Widget Tree-t Element Tree-vé alakítja: minden Widget létrehoz egy Element-et, amely nyomon követi a pozíciót a fában és a kapcsolatot a RenderObject-tel. A Render Tree végrehajtja a layout-ot (méretek és pozíciók meghatározása) és a paint-et (rajzolás). Az Element a kulcsfontosságú optimalizációs réteg: ha a widget típusa és a key nem változott a rebuild során, az Element újrahasznosításra kerül, frissítve a konfigurációt a RenderObject újbóli létrehozása nélkül. Ez biztosítja a Flutter teljesítményét magas képkockasebesség mellett (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 Widgetek')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Icon(Icons.flutter_dash, size: 80),
            const SizedBox(height: 16),
            const Text(
              'Helló, Flutter!',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

A HomeScreen widgetfája: Scaffold → AppBar + Center → Column → [Icon, SizedBox, Text]. Scaffold – a Material Design fő layout widgetje. A Center középre igazítja a gyermek Column-t. A Column függőlegesen rendezi el a gyermekeket középre igazítással (mainAxisAlignment.center). A Flutter a layout-ot felülről lefelé számítja (a constraint-ek a szülőtől kerülnek átadásra), a méreteket pedig alulról felfelé (sizedByParent vagy sizing from children).

BuildContext: build kontextus és hozzáférés a fához

BuildContext – a widget pozíciójának leírója az Element Tree-ben. Minden build() metódus kap egy BuildContext-et, amelyen keresztül a widget hozzáférhet a következőkhöz:MediaQuery (képernyőméret, tájolás, pixelsűrűség, biztonságos terület), Theme (MaterialThemeData vagy CupertinoThemeData), Navigator (navigációs verem), ScaffoldMessenger (SnackBar), InheritedWidget (adatok továbbítása lefelé a fában). A BuildContext nem tárolható el a build() befejezése után, és nem használható szinkron kontextuson kívül – ez olyan hibákhoz vezet, mint a „Scaffold.of() called with a context that does not contain a Scaffold”. A context tárolása helyett használja a Builder widgetet vagy az InheritedWidget mintát az adatok eléréséhez.

Key: a widget azonosítása a fában

Key – minden widget konstruktorának opcionális paramétere (super.key). A Key segít a Flutter-nek a widget azonosításában a lista elemeinek sorrendjének/számának változásakor. Key nélkül a Flutter típus és pozíció alapján hasonlítja össze a widgeteket; amikor elemet adunk hozzá a lista közepéhez key nélkül, a Flutter a rossz widgethez használja újra az Element-et, ami állapot (StatefulWidget) és animációs hibákat okoz. Listákhoz használjon ValueKey-t (egyedi azonosító), ObjectKey-t (adatobjektum alapján), UniqueKey-t (garantáltan egyedi minden rebuild-nél – kényszerített újbóli létrehozáshoz).

Flutter widget katalógus: Material, Cupertino, Layout

A Flutter SDK (stabil verzió 3.3+, Dart 3+) 200+ beépített widgetet tartalmaz, kategóriákra bontva: 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) és Accessibility (Semantics, MergeSemantics, ExcludeSemantics). A Layout widgetek minden Flutter UI alapját képezik: Row vízszintes sorozatokhoz, Column függőlegesekhez, Stack átfedő elemekhez, Container BoxDecoration-nal díszítéshez.

KategóriaKulcs widgetekRendeltetés
LayoutRow, Column, Stack, Container, Expanded, FlexibleGyermek elemek pozícionálása és méretezése
MaterialScaffold, AppBar, Card, Drawer, FAB, TabBarMaterial Design 3 UI komponensek
CupertinoCupertinoPageScaffold, CupertinoNavigationBar, CupertinoButtoniOS-stílusú komponensek
PaintingOpacity, ClipRect, Transform, DecoratedBox, BackdropFilterVizuális effektusok és vágás
AsyncFutureBuilder, StreamBuilderAszinkron adatbetöltés UI állapotokkal
AccessibilitySemantics, MergeSemanticsSzemantikus jelölés képernyőolvasók számára

Gyakran Ismételt Kérdések

Miben különbözik a StatelessWidget a StatefulWidget-től?

StatelessWidget nem rendelkezik belső állapottal – minden adat a konstruktoron keresztül kerül átadásra és nem változik. A StatefulWidget a változó állapotot egy külön State objektumban tárolja, amely túléli a rebuild-eket. Az állapotváltozás meghívja a setState()-et, és a Flutter újraépíti az UI-t. Változatlan elemekhez használjon StatelessWidget-et; interaktív elemekhez – StatefulWidget-et.

Mi az a BuildContext a Flutter-ben?

BuildContext – a widget pozíciójának leírója az Element Tree-ben, amely a build() metódusnak kerül átadásra. A context-en keresztül a widget hozzáfér a MediaQuery-hez, Theme-hez, Navigator-hoz, ScaffoldMessenger-hez és InheritedWidget-hoz. A BuildContext nem tárolható el a build() befejezése után. Az adatok eléréséhez használja a Builder widgetet vagy az InheritedWidget-ot.

Szükséges-e ismerni a Dart-ot a Flutter használatához?

Igen, a Flutter a Dart-ot használja egyetlen programozási nyelvként. A Dart egy statikusan típusos nyelv null-safety, hang típusok (sound null safety), extension methods és pattern matching támogatással. Kezdésnek elegendőek a Dart alapjai: osztályok, függvények, async/await, gyűjtemények. A Dart natív kódba (AOT) a Dart Native segítségével, JavaScript-be (web esetén) a Dart2JS segítségével fordul.

A Flutter csak mobil platformokra való?

Nem, a Flutter hat platformot támogat: iOS, Android, Web, macOS, Windows, Linux. A kód több mint 90%-a közös minden platformon. A platform-adaptációk (kamera, fájlrendszer) beépülő modulokon vagy platform csatornákon keresztül valósulnak meg. Asztali számítógépekhez a Flutter a Flutter Desktop ablakburkolót, webhez a CanvasKit motort (WebGL) vagy a HTML renderelőt használja.

Hogyan biztosítja a Flutter a 60 FPS teljesítményt?

A Flutter 60/120 FPS-t ér el a saját 2D motorjának (Skia/Impeller), a natív bridge hiányának (ellentétben a React Native-tel), a három fának (Widget → Element → Render) az Element újrahasznosításával változatlan típus/key esetén, az egyirányú áthaladású layout algoritmusnak (constraints down, sizes up) és a RepaintBoundary-nak köszönhetően, amely elkülöníti az egyes képernyőzónák újrarajzolását.

Összefoglalás

  • Flutter Widgetek – az összes UI elem: Scaffold-tól SizedBox-ig; a Flutter saját maga rajzolja őket a Skia/Impeller-en, natív komponensek használata nélkül.
  • StatelessWidget – állapot nélküli widget; a build() a konstruktor változatlan paraméterei alapján adja vissza az UI-t.
  • StatefulWidget – változó állapotú widget a State-ben; a setState() UI rebuild-et vált ki.
  • Három fa Flutter: Widget (konfiguráció) → Element (pozíció) → Render (layout + paint); az Element újrahasznosításra kerül a teljesítmény érdekében.
  • BuildContext – a widget pozíciója a fában; hozzáférés a MediaQuery-hez, Theme-hez, Navigator-hoz, InheritedWidget-hoz.
  • Material és Cupertino – két widget készlet a Google Material Design 3-hoz és az Apple HIG-hez.
  • Key (ValueKey, ObjectKey, UniqueKey) – a widget azonosítása a lista sorrendjének/számának változásakor.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is