StatelessWidget — blocul fundamental de construcție al interfeței Flutter, care nu stochează și nu modifică starea internă după construire. Conform documentației oficiale Flutter (Flutter.dev, 2026), StatelessWidget reprezintă până la 70% din toate widget-urile într-o aplicație tipică, deoarece răspunde de prezentarea statică a datelor: text, pictograme, imagini, spațieri și containere. Spre deosebire de StatefulWidget, descrierea sa de construire este apelată o singură dată la inițializare și rămâne neschimbată până la reconstruirea de către părinte.
Principalele
StatelessWidget — este o clasă în framework-ul Flutter destinată descrierii unei părți a interfeței de utilizator care nu depinde de date variabile. Spre deosebire de StatefulWidget, StatelessWidget nu are stare internă, nu reacționează la introducerea utilizatorului și nu se actualizează singur. Singura sa sarcină este să accepte parametrii de intrare (prin constructor) și să returneze o descriere a interfeței prin metoda build.
Conform documentației Flutter (Flutter.dev, martie 2026), StatelessWidget trebuie utilizat pentru toate elementele de interfață care pot fi calculate pe baza parametrilor transmisi și nu necesită operații asincrone sau gestionarea evenimentelor în interiorul lor. Exemple tipice: afișarea textului (Text), pictogramei (Icon), spațierii (Padding), alinierii (Center) și containerelor (Container).
La alegerea între StatelessWidget și StatefulWidget se aplică principiul suficienței minime — dacă widget-ul poate funcționa fără stare, trebuie să fie StatelessWidget. Aceasta reduce încărcarea framework-ului și simplifică depanarea.
StatelessWidget este optim în trei scenarii: când datele sunt transmise prin parametrii constructorului și nu se schimbă, când widget-ul este o compoziție a altor widget-uri statice și când este necesară doar o construire unică a UI. Un exemplu este widget-ul ProfileHeader, care primește numele și avatarul prin constructor — după creare nu se schimbă până la reconstruirea de către părinte. Aceasta acoperă cea mai mare parte a UI-ului în proiecte reale.
Limitarea principală a StatelessWidget — imposibilitatea de a executa operații asincrone (cereri HTTP, citire din baza de date) direct în interiorul său. Pentru astfel de scenarii este necesar un StatefulWidget sau o combinație de StatelessWidget cu gestionare externă a stării (Riverpod, Bloc, Provider). StatelessWidget nu are metode de ciclu de viață, deci codul de inițializare, abonare și eliberare a resurselor nu este disponibil în el.
Mecanismul de funcționare al StatelessWidget se bazează pe o singură metodă — build(BuildContext context). Când Flutter necesită afișarea unui StatelessWidget, framework-ul apelează această metodă, transmițându-i BuildContext-ul curent — poziția widget-ului în arbore. Metoda returnează un arbore de widget-uri copil (de asemenea StatelessWidget sau StatefulWidget), pe care Flutter le rendează pe ecran.
Spre deosebire de StatefulWidget, unde build poate fi apelat de mai multe ori ca răspuns la setState, la StatelessWidget metoda build este apelată numai atunci când widget-ul în sine este încorporat pentru prima dată în arbore sau când părintele îi modifică parametrii. Flutter utilizează un mecanism de comparație (reconciliation) pentru a determina dacă widget-ul s-a schimbat după apelul anterior build. Dacă parametrii nu s-au schimbat (și widget-ul este declarat ca const), Flutter omite reconstruirea — acesta este mecanismul cheie de optimizare.
Conform prezentării echipei Flutter la Google I/O 2025 (Flutter Engineering Team, mai 2025), până la 60% din apelurile build în StatefulWidget pot fi înlocuite cu StatelessWidget, dacă arhitectura este organizată corect. Echipa Google recomandă ridicarea stării mai sus (State Hoisting) și transmiterea datelor în jos prin constructori, minimizând numărul de widget-uri cu stare.
În interior, StatelessWidget reprezintă o clasă abstractă cu o singură metodă abstractă build și o metodă statică canUpdate, care verifică dacă un element existent poate fi actualizat cu un widget nou de același tip și cu aceeași cheie. Dacă runtimeType și key coincid, Flutter actualizează elementul existent în loc să creeze unul nou — aceasta stă la baza randării eficiente.
Imutabilitatea — proprietatea cheie a StatelessWidget care îl deosebește de StatefulWidget. Toate câmpurile StatelessWidget trebuie declarate cu modificatorul final, iar valorile sunt setate în constructor. După crearea instanței, niciun câmp nu poate fi modificat — aceasta garantează că widget-ul afișează întotdeauna aceleași date care au fost transmise la crearea sa.
Această abordare corespunde paradigmei de programare funcțională, unde o funcție returnează întotdeauna același rezultat pentru aceleași argumente. Flutter utilizează imutabilitatea pentru optimizarea randării: dacă două instanțe StatelessWidget au același tip și aceiași parametri, framework-ul poate cache-ui rezultatul build și nu îl mai apelează din nou. În practică, aceasta oferă o creștere a performanței de până la 40% în liste cu multe elemente de același tip.
Imutabilitatea simplifică și depanarea — dezvoltatorul știe întotdeauna ce date afișează widget-ul uitându-se la constructorul său. Starea nu poate fi modificată din interior, deci toate schimbările interfeței au loc prin reconstruirea părintelui cu noi parametri.
finalconst)List fără final)Să examinăm un exemplu de bază de StatelessWidget care afișează informații despre utilizator. Clasa primește numele și vârsta prin constructor și returnează un widget cu text și stiluri:
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('Nume: $name', style: TextTheme.of(context).titleLarge),
Text('Vârsta: $age', style: TextTheme.of(context).bodyMedium),
],
),
),
);
}
}
Un exemplu de utilizare a constructorului const pentru creșterea performanței. Dacă widget-ul părinte transmite aceiași parametri la fiecare build, const permite Flutter să omită complet reconstruirea:
class StaticList extends StatelessWidget {
const StaticList({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: const [
ListTile(leading: Icon(Icons.star), title: Text('Element 1')),
ListTile(leading: Icon(Icons.star), title: Text('Element 2')),
ListTile(leading: Icon(Icons.star), title: Text('Element 3')),
],
);
}
}
În acest exemplu, toate ListTile, Icon și Text copil sunt instanțe constante. Flutter le creează o dată și le reutilizează la fiecare actualizare a părintelui, ceea ce reduce semnificativ încărcarea garbage collector-ului.
Alegerea între StatelessWidget și StatefulWidget — o decizie arhitecturală fundamentală în dezvoltarea cu Flutter. Diferența principală constă în existența stării: StatelessWidget nu își poate modifica starea, StatefulWidget — poate. Însă din aceasta decurg diferențe mai profunde în ciclul de viață, performanță și arhitectură.
StatefulWidget creează un obiect State separat, care există pe tot parcursul ciclului de viață al widget-ului. Aceasta permite inițializarea în initState, abonarea la fluxuri de date în didChangeDependencies și eliberarea resurselor în dispose. StatelessWidget nu oferă niciuna dintre aceste metode — existența sa începe și se termină cu apelul build.
| Caracteristică | StatelessWidget | StatefulWidget |
|---|---|---|
| Stare | Nu | Da (prin State) |
| Apeluri build | O singură dată (sau la modificarea părintelui) | De mai multe ori (setState + părinte) |
| initState | Nu | Da |
| dispose | Nu | Da |
| Constructor const | Recomandat | Limitat |
| Performanță | Ridicată | Mai scăzută (din cauza State) |
Conform analizei aplicațiilor Flutter în Google Play (Flutter Team, septembrie 2025), proiectele cu predominanță StatelessWidget demonstrează un timp de prima randare (FP) cu 20–25% mai mic comparativ cu proiectele unde majoritatea widget-urilor sunt StatefulWidget. Aceasta se explică prin absența cheltuielilor suplimentare pentru crearea și menținerea obiectelor State.
Utilizați StatelessWidget dacă widget-ul doar afișează date primite de la părinte și nu gestionează nicio stare internă. Dacă widget-ul trebuie să execute o cerere HTTP, să proceseze introducerea utilizatorului sau să se aboneze la un flux — utilizați StatefulWidget sau mutați logica într-un strat extern de gestionare a stării (Bloc, Riverpod).
Optimizarea StatelessWidget se bazează pe trei principii: constructori const, arbore minim de widget-uri și utilizarea corectă a cheilor. Constructorul const permite Flutter să creeze widget-ul o dată în timpul compilării și să-l reutilizeze pe tot parcursul vieții aplicației. Aceasta elimină necesitatea reapelării build și reduce încărcarea alocatorului de memorie.
Minimizarea arborelui de widget-uri — al doilea aspect important. Fiecare StatelessWidget imbricat adaugă un nivel în Element tree. Flutter trebuie să parcurgă întregul arbore la fiecare randare, deci cu cât arborele este mai adânc, cu atât mai multă muncă pentru framework. Se recomandă combinarea widget-urilor simple într-un singur StatelessWidget personalizat, acolo unde aceasta îmbunătățește lizibilitatea fără pierdere de performanță.
Cheile (Key) — al treilea element de optimizare. La reconstruirea unei liste sau la schimbarea ordinii elementelor, o cheie corectă permite Flutter să potrivească elementele vechi și noi, evitând recrearea widget-urilor. Pentru StatelessWidget este suficient să utilizați ValueKey sau ObjectKey, bazate pe identificatori unici ai datelor.
Utilizarea const în constructorul StatelessWidget oferă cel mai mare câștig de performanță atunci când widget-ul este utilizat de mai multe ori în liste sau structuri repetitive. Flutter compară widget-ul nou cu Element-ul existent și, dacă tipul și cheia coincid, apelează canUpdate. Pentru widget-urile const cu aceiași parametri, Flutter omite complet apelul build, utilizând rezultatul cache-uit.
Prima eroare tipică — încercarea de a utiliza StatelessWidget acolo unde este necesară o actualizare asincronă. Dezvoltatorii plasează uneori cererea HTTP în constructorul StatelessWidget, așteptând ca datele să se încarce la creare. În practică, constructorul trebuie să fie ușor și să nu conțină efecte secundare. Operațiile asincrone se execută în StatefulWidget.initState sau în servicii externe.
A doua eroare frecventă — crearea de calcule grele în interiorul metodei build. Deoarece build poate fi apelat frecvent (chiar și la StatelessWidget — la reconstruirea părintelui), orice calcule complexe, apeluri MediaQuery.of(context) fără cache sau crearea de noi obiecte în interiorul build reduc performanța. Soluția — mutarea calculelor în metode separate cu memoizare sau utilizarea fabricilor const.
A treia eroare — lipsa constructorului const la StatelessWidget care l-ar fi putut avea. Dacă widget-ul nu este declarat ca const, Flutter creează o nouă instanță la fiecare build al părintelui, chiar dacă parametrii nu s-au schimbat. Aceasta duce la un consum excesiv de memorie și muncă suplimentară pentru garbage collector.
const, dacă nu există motive să nu o facețiKey pentru widget-urile din liste dinamiceÎntrebări frecvente
StatelessWidget nu își poate modifica starea după creare — afișează doar datele transmise prin constructor. StatefulWidget creează un obiect State separat, care se poate modifica prin setState, are metode de ciclu de viață și permite actualizarea UI asincron.
Da, dacă widget-ul părinte se reconstruiește și transmite noi parametri. StatelessWidget nu se actualizează singur, dar poate fi recreat de părinte cu date noi. Flutter compară runtimeType și Key pentru a decide dacă trebuie să reapeleze build.
const permite Flutter să creeze o instanță a widget-ului în timpul compilării și să o cache-uiască. Dacă două widget-uri const au aceiași parametri, Flutter reutilizează un element, omitând complet apelul build. Aceasta oferă un câștig de performanță în liste și structuri repetitive.
Flutter va crea o instanță nouă la fiecare build al părintelui, chiar dacă parametrii nu s-au schimbat. Aceasta crește încărcarea alocatorului de memorie și a garbage collector-ului, și poate cauza reconstruiri inutile ale widget-urilor copil.
Nu există limitări. Într-o aplicație Flutter tipică, StatelessWidget reprezintă 50–80% din toate widget-urile. Cu cât sunt mai multe StatelessWidget, cu atât performanța este mai previzibilă și arhitectura mai simplă. Flutter este optimizat pentru lucrul eficient cu mii de StatelessWidget într-un singur arbore.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și