StatelessWidget — a Flutter felület alapvető építőeleme, amely nem tárol és nem módosít belső állapotot az összeépítés után. A hivatalos Flutter dokumentáció szerint (Flutter.dev, 2026) a StatelessWidget a tipikus alkalmazások widgetjeinek akár 70%-át teszi ki, mivel az adatok statikus megjelenítéséért felelős: szöveg, ikonok, képek, paddingek és konténerek. A StatefulWidget-tel ellentétben az építési leírása egyszer kerül meghívásra inicializáláskor, és változatlan marad a szülő általi újraépítésig.
A lényeg
StatelessWidget — egy osztály a Flutter keretrendszerben, amely a felhasználói felület változó adatoktól független részének leírására szolgál. A StatefulWidget-tel ellentétben a StatelessWidget nem rendelkezik belső állapottal, nem reagál a felhasználói bevitelre, és nem frissíti magát. Az egyetlen feladata a bemeneti paraméterek (a konstruktoron keresztül) fogadása és a felület leírásának visszaadása a build metóduson keresztül.
A Flutter dokumentáció szerint (Flutter.dev, 2026. március) a StatelessWidget-et kell használni minden olyan felületelemhez, amely a megadott paraméterek alapján kiszámítható, és nem igényel aszinkron műveleteket vagy eseménykezelést. Tipikus példák: szöveg megjelenítése (Text), ikon (Icon), padding (Padding), igazítás (Center) és konténerek (Container).
A StatelessWidget és StatefulWidget közötti választáskor a minimális elegendőség elve érvényesül — ha egy widget képes állapot nélkül működni, StatelessWidget-nek kell lennie. Ez csökkenti a keretrendszer terhelését és leegyszerűsíti a hibakeresést.
StatelessWidget három forgatókönyvben optimális: amikor az adatok a konstruktor paraméterein keresztül kerülnek átadásra és nem változnak, amikor a widget más statikus widgetek kompozíciója, és amikor csak egyszeri UI-építés szükséges. Példa a ProfileHeader widget, amely a nevet és az avatárt a konstruktoron keresztül kapja — létrehozás után nem változik a szülő általi újraépítésig. Ez a valós projektek UI-jának nagy részét lefedi.
A StatelessWidget fő korlátja — az aszinkron műveletek (HTTP-kérések, adatbázis-olvasás) közvetlen végrehajtásának képtelensége. Ilyen forgatókönyvekhez StatefulWidget-re vagy StatelessWidget és külső állapotkezelés (Riverpod, Bloc, Provider) kombinációjára van szükség. A StatelessWidget nem rendelkezik életciklus-metódusokkal, így inicializációs, feliratkozási és erőforrás-felszabadítási kód nem érhető el benne.
A StatelessWidget működési mechanizmusa egyetlen metóduson alapul — a build(BuildContext context)-en. Amikor a Flutter-nek meg kell jelenítenie egy StatelessWidget-et, a keretrendszer meghívja ezt a metódust, átadva neki az aktuális BuildContext-et — a widget pozícióját a fában. A metódus visszaadja a gyermek widgetek (szintén StatelessWidget vagy StatefulWidget) fáját, amelyet a Flutter ezután a képernyőn renderel.
A StatefulWidget-tel ellentétben, ahol a build többször is meghívható a setState-re válaszul, a StatelessWidget-ben a build metódus csak akkor kerül meghívásra, amikor maga a widget először beépül a fába, vagy amikor a szülő megváltoztatja a paramétereit. A Flutter összehasonlító mechanizmust (reconciliation) használ annak meghatározására, hogy a widget megváltozott-e az előző build-hívás után. Ha a paraméterek nem változtak (és a widget const-ként van deklarálva), a Flutter kihagyja az újraépítést — ez a kulcsfontosságú optimalizálási mechanizmus.
A Flutter csapat Google I/O 2025-ös előadása szerint (Flutter Engineering Team, 2025. május) a StatefulWidget-ben lévő build-hívások akár 60%-a helyettesíthető StatelessWidget-dzsel, ha az architektúra megfelelően van megszervezve. A Google csapat azt javasolja, hogy az állapotot emeljük magasabbra (State Hoisting), és az adatokat konstruktorokon keresztül adjuk át lefelé, minimalizálva az állapottal rendelkező widgetek számát.
Belsőleg a StatelessWidget egy absztrakt osztályt képvisel, egyetlen absztrakt metódussal (build) és egy statikus metódussal (canUpdate), amely ellenőrzi, hogy egy meglévő elem frissíthető-e egy új, azonos típusú és azonos kulcsú widget-tel. Ha a runtimeType és a key megegyezik, a Flutter a meglévő elemet frissíti az új létrehozása helyett — ez a hatékony renderelés alapja.
Immutability — a StatelessWidget kulcsfontosságú tulajdonsága, amely megkülönbözteti a StatefulWidget-től. A StatelessWidget összes mezőjét a final módosítóval kell deklarálni, és az értékeket a konstruktorban kell beállítani. A példány létrehozása után egyetlen mező sem módosítható — ez garantálja, hogy a widget mindig ugyanazokat az adatokat jeleníti meg, amelyeket a létrehozáskor kaptak.
Ez a megközelítés megfelel a funkcionális programozási paradigmának, ahol egy függvény ugyanazokra az argumentumokra mindig ugyanazt az eredményt adja vissza. A Flutter az immutability-t használja a renderelés optimalizálására: ha két StatelessWidget példány azonos típusú és azonos paraméterekkel rendelkezik, a keretrendszer gyorsítótárazhatja a build eredményét, és nem hívja meg újra. A gyakorlatban ez akár 40%-os teljesítménynövekedést jelent az azonos típusú elemeket tartalmazó listákban.
Az immutability a hibakeresést is leegyszerűsíti — a fejlesztő a konstruktorra pillantva mindig tudja, hogy a widget milyen adatokat jelenít meg. Az állapot nem módosítható belülről, így a felület minden változása a szülő új paraméterekkel történő újraépítésén keresztül történik.
finalconst)List final nélkül)Tekintsünk meg egy alapvető StatelessWidget példát, amely felhasználói információkat jelenít meg. Az osztály a nevet és az életkort a konstruktoron keresztül kapja, és egy szöveggel és stílusokkal ellátott widgetet ad vissza:
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('Név: $name', style: TextTheme.of(context).titleLarge),
Text('Kor: $age', style: TextTheme.of(context).bodyMedium),
],
),
),
);
}
}
Példa a const konstruktor használatára a teljesítmény növelésére. Ha a szülő widget minden build-kor ugyanazokat a paramétereket adja át, a const lehetővé teszi a Flutter számára az újraépítés teljes kihagyását:
class StaticList extends StatelessWidget {
const StaticList({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: const [
ListTile(leading: Icon(Icons.star), title: Text('1. elem')),
ListTile(leading: Icon(Icons.star), title: Text('2. elem')),
ListTile(leading: Icon(Icons.star), title: Text('3. elem')),
],
);
}
}
Ebben a példában az összes gyermek ListTile, Icon és Text konstans példány. A Flutter egyszer hozza létre őket, és minden szülői frissítéskor újra felhasználja, ami jelentősen csökkenti a garbage collector terhelését.
A StatelessWidget és a StatefulWidget közötti választás — alapvető architekturális döntés a Flutter-ben történő fejlesztés során. A fő különbség az állapot meglétében rejlik: a StatelessWidget nem tudja megváltoztatni az állapotát, a StatefulWidget igen. Ebből azonban mélyebb különbségek következnek az életciklusban, a teljesítményben és az architektúrában.
A StatefulWidget létrehoz egy külön State objektumot, amely a widget teljes életciklusa alatt létezik. Ez lehetővé teszi az inicializálást az initState-ban, az adatfolyamokra való feliratkozást a didChangeDependencies-ben, és az erőforrások felszabadítását a dispose-ban. A StatelessWidget ezen metódusok egyikét sem biztosítja — létezése a build meghívásával kezdődik és ér véget.
| Jellemző | StatelessWidget | StatefulWidget |
|---|---|---|
| Állapot | Nincs | Van (State-en keresztül) |
| Build-hívások | Egyszer (vagy szülő változásakor) | Többször (setState + szülő) |
| initState | Nincs | Van |
| dispose | Nincs | Van |
| const konstruktor | Ajánlott | Korlátozott |
| Teljesítmény | Magas | Alacsonyabb (a State miatt) |
A Google Play-ben található Flutter-alkalmazások elemzése szerint (Flutter Team, 2025. szeptember) a StatelessWidget túlsúlyával rendelkező projektek 20–25%-kal rövidebb első renderelési időt (FP) mutatnak azokhoz a projektekhez képest, ahol a widgetek többsége StatefulWidget. Ez a State objektumok létrehozásának és karbantartásának többletköltségeinek hiányával magyarázható.
Használj StatelessWidget-et, ha a widget csak a szülőtől kapott adatokat jeleníti meg, és nem kezel semmilyen belső állapotot. Ha a widgetnek HTTP-kérést kell végrehajtania, felhasználói bevitelt kell feldolgoznia, vagy fel kell iratkoznia egy adatfolyamra — használj StatefulWidget-et, vagy helyezd a logikát egy külső állapotkezelő rétegbe (Bloc, Riverpod).
A StatelessWidget optimalizálása három elven alapul: const konstruktorok, minimális widgetfa és a kulcsok helyes használata. A const konstruktor lehetővé teszi a Flutter számára, hogy a widgetet egyszer, fordítási időben hozza létre, és az alkalmazás teljes élettartama alatt újra felhasználja. Ez megszünteti a build ismételt meghívásának szükségességét, és csökkenti a memória-allokátor terhelését.
A widgetfa minimalizálása — a második fontos szempont. Minden beágyazott StatelessWidget egy szintet ad az Element tree-hez. A Flutter-nek minden rendereléskor be kell járnia a teljes fát, így minél mélyebb a fa, annál több munka vár a keretrendszerre. Javasolt az egyszerű widgeteket egy egyedi StatelessWidget-be kombinálni, ahol ez olvashatóságot javít a teljesítmény elvesztése nélkül.
A kulcsok (Key) — az optimalizálás harmadik eleme. Lista újraépítésekor vagy az elemek sorrendjének megváltoztatásakor a helyes kulcs lehetővé teszi a Flutter számára a régi és új elemek összepárosítását, elkerülve a widgetek újbóli létrehozását. StatelessWidget esetén elegendő a ValueKey vagy ObjectKey használata, amelyek az adatok egyedi azonosítóin alapulnak.
A const használata a StatelessWidget konstruktorában a legnagyobb teljesítménynövekedést akkor adja, amikor a widgetet többször használják listákban vagy ismétlődő szerkezetekben. A Flutter összehasonlítja az új widgetet a meglévő Elemmel, és ha a típus és a kulcs megegyezik, meghívja a canUpdate-ot. Az azonos paraméterekkel rendelkező const widgetek esetében a Flutter teljesen kihagyja a build-hívást, a gyorsítótárazott eredményt használva.
Az első gyakori hiba — a StatelessWidget használatának kísérlete ott, ahol aszinkron frissítésre van szükség. A fejlesztők néha HTTP-kérést helyeznek a StatelessWidget konstruktorába, abban a reményben, hogy az adatok betöltődnek a létrehozáskor. A gyakorlatban a konstruktornak könnyűnek kell lennie, és nem tartalmazhat mellékhatásokat. Az aszinkron műveletek a StatefulWidget.initState-ban vagy külső szolgáltatásokban hajtódnak végre.
A második gyakori hiba — nehéz számítások végzése a build metóduson belül. Mivel a build gyakran meghívható (még StatelessWidget esetén is — a szülő újraépítésekor), bármilyen összetett számítás, MediaQuery.of(context) hívás gyorsítótárazás nélkül, vagy új objektumok létrehozása a build-en belül csökkenti a teljesítményt. Megoldás — a számítások kiszervezése külön metódusokba memoizációval vagy const gyárak használata.
A harmadik hiba — a const konstruktor hiánya a StatelessWidget-nél, amelynek lehetne ilyenje. Ha a widget nincs const-ként deklarálva, a Flutter minden szülői build-kor új példányt hoz létre, még akkor is, ha a paraméterek nem változtak. Ez túlzott memóriahasználathoz és a garbage collector többletmunkájához vezet.
const-ként, hacsak nincs okod ennek elmulasztásáraKey-et a dinamikus listákban lévő widgetekhezGyakran ismételt kérdések
StatelessWidget nem tudja megváltoztatni az állapotát létrehozás után — csak a konstruktoron keresztül kapott adatokat jeleníti meg. A StatefulWidget létrehoz egy külön State objektumot, amely a setState-en keresztül változhat, életciklus-metódusokkal rendelkezik, és lehetővé teszi az UI aszinkron frissítését.
Igen, ha a szülő widget újraépül és új paramétereket ad át. A StatelessWidget nem frissíti magát, de a szülő új adatokkal újjáépítheti. A Flutter összehasonlítja a runtimeType-ot és a Key-et annak eldöntésére, hogy újra kell-e hívni a build-et.
A const lehetővé teszi a Flutter számára, hogy a widget példányát fordítási időben hozza létre és gyorsítótárazza. Ha két const widget azonos paraméterekkel rendelkezik, a Flutter újra felhasznál egy elemet, teljesen kihagyva a build-hívást. Ez teljesítménynövekedést biztosít listákban és ismétlődő szerkezetekben.
A Flutter új példányt hoz létre minden szülői build-kor, még akkor is, ha a paraméterek nem változtak. Ez növeli a memória-allokátor és a garbage collector terhelését, valamint szükségtelen gyermek widget újraépítéseket okozhat.
Nincsenek korlátok. Egy tipikus Flutter-alkalmazásban a StatelessWidget az összes widget 50–80%-át teszi ki. Minél több StatelessWidget van, annál kiszámíthatóbb a teljesítmény és egyszerűbb az architektúra. A Flutter optimalizálva van arra, hogy hatékonyan működjön együtt több ezer StatelessWidget-dzsel egy fában.
Összefoglalás
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.
Olvassa el is