StatelessWidget — фундаментални градивни блок интерфејса Flutter-а, који не чува и не мења унутрашње стање након изградње. Према званичној документацији Flutter-а (Flutter.dev, 2026), StatelessWidget чини до 70% свих виџета у типичној апликацији, јер је одговоран за статички приказ података: текст, иконе, слике, размаке и контејнере. За разлику од StatefulWidget-а, његов опис изградње позива се једнократно при иницијализацији и остаје непромењен до поновне изградње од стране родитеља.
Главне ствари
StatelessWidget — класа у Flutter фрејмворку намењена за описивање дела корисничког интерфејса који не зависи од променљивих података. За разлику од StatefulWidget-а, StatelessWidget нема унутрашње стање, не реагује на кориснички унос и не ажурира се самостално. Његов једини задатак је да прими улазне параметре (кроз конструктор) и врати опис интерфејса кроз метод build.
Према документацији Flutter-а (Flutter.dev, март 2026), StatelessWidget треба користити за све елементе интерфејса који се могу израчунати на основу прослеђених параметара и не захтевају асинхроне операције или обраду догађаја унутар себе. Типични примери: приказ текста (Text), иконе (Icon), размака (Padding), поравнање (Center) и контејнера (Container).
При избору између StatelessWidget-а и StatefulWidget-а примењује се принцип минималне довољности — ако виџет може да ради без стања, треба да буде StatelessWidget. Ово смањује оптерећење фрејмворка и поједностављује отклањање грешака.
StatelessWidget је оптималан у три сценарија: када се подаци прослеђују кроз параметре конструктора и не мењају се, када је виџет композиција других статичких виџета и када је потребна само једнократна изградња UI. Пример је виџет ProfileHeader, који прима име и аватар кроз конструктор — након креирања не мења се до поновне изградње од стране родитеља. Ово покрива већину UI-ја у реалним пројектима.
Главно ограничење StatelessWidget-а — немогућност извођења асинхроних операција (HTTP захтеви, читање из базе) директно унутар себе. За такве сценарије потребан је StatefulWidget или комбинација StatelessWidget-а са спољним управљањем стањем (Riverpod, Bloc, Provider). StatelessWidget нема методе животног циклуса, па код иницијализације, претплате и ослобађања ресурса није доступан у њему.
Механизам рада StatelessWidget-а заснива се на једној методи — build(BuildContext context). Када Flutter захтева приказ StatelessWidget-а, фрејмворк позива ову методу, прослеђујући јој тренутни BuildContext — положај виџета у стаблу. Метода враћа стабло виџета деце (такође StatelessWidget или StatefulWidget), које Flutter затим рендерује на екрану.
За разлику од StatefulWidget-а, где build може бити позван више пута као одговор на setState, код StatelessWidget-а метода build се позива само када се сам виџет први пут уграђује у стабло или када родитељ мења његове параметре. Flutter користи механизам поређења (reconciliation) да утврди да ли се виџет променио након претходног позива build. Ако се параметри нису променили (и виџет је декларисан као const), Flutter прескаче поновну изградњу — ово је кључни механизам оптимизације.
Према презентацији Flutter тима на Google I/O 2025 (Flutter Engineering Team, мај 2025), до 60% позива build у StatefulWidget-у може се заменити StatelessWidget-ом, ако је архитектура правилно организована. Google тим препоручује подизање стања више (State Hoisting) и прослеђивање података наниже кроз конструкторе, минимизирајући број виџета са стањем.
Унутра, StatelessWidget представља апстрактну класу са једином апстрактном методом build и једном статичком методом canUpdate, која проверава да ли се постојећи елемент може ажурирати новим виџетом истог типа и са истим key. Ако се runtimeType и key поклапају, Flutter ажурира постојећи елемент уместо креирања новог — ово је основа ефикасног рендеровања.
Имутабилност — кључно својство StatelessWidget-а које га разликује од StatefulWidget-а. Сва поља StatelessWidget-а морају бити декларисана са модификатором final, а вредности се постављају у конструктору. Након креирања инстанце, ниједно поље не може бити промењено — ово гарантује да виџет увек приказује исте податке који су му прослеђени при креирању.
Овај приступ одговара функционалној парадигми програмирања, где функција увек враћа исти резултат за исте аргументе. Flutter користи имутабилност за оптимизацију рендеровања: ако две инстанце StatelessWidget-а имају исти тип и исте параметре, фрејмворк може кеширати резултат build и не позивати га поново. У пракси, ово даје повећање перформанси до 40% у листама са много елемената истог типа.
Имутабилност такође поједностављује отклањање грешака — програмер увек зна које податке виџет приказује гледајући његов конструктор. Стање се не може променити изнутра, па се све промене интерфејса дешавају кроз поновну изградњу родитеља са новим параметрима.
finalconst)List без final)Размотримо основни пример StatelessWidget-а који приказује информације о кориснику. Класа прима име и старост кроз конструктор и враћа виџет са текстом и стиловима:
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('Име: $name', style: TextTheme.of(context).titleLarge),
Text('Године: $age', style: TextTheme.of(context).bodyMedium),
],
),
),
);
}
}
Пример употребе const конструктора за повећање перформанси. Ако родитељски виџет прослеђује исте параметре при сваком build, const омогућава Flutter-у да потпуно прескочи поновну изградњу:
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')),
ListTile(leading: Icon(Icons.star), title: Text('Ставка 2')),
ListTile(leading: Icon(Icons.star), title: Text('Ставка 3')),
],
);
}
}
У овом примеру, сва дечија ListTile, Icon и Text су константне инстанце. Flutter их креира једном и поново користи при сваком ажурирању родитеља, што значајно смањује оптерећење garbage collector-а.
Избор између StatelessWidget-а и StatefulWidget-а — фундаментална архитектонска одлука при развоју у Flutter-у. Основна разлика је у поседовању стања: StatelessWidget не може мењати своје стање, StatefulWidget — може. Међутим, из овога произилазе дубље разлике у животном циклусу, перформансама и архитектури.
StatefulWidget креира засебан објекат State, који постоји током целог животног циклуса виџета. Ово омогућава иницијализацију у initState, претплату на токове података у didChangeDependencies и ослобађање ресурса у dispose. StatelessWidget не пружа ниједну од ових метода — његово постојање почиње и завршава се позивом build.
| Карактеристика | StatelessWidget | StatefulWidget |
|---|---|---|
| Стање | Нема | Има (кроз State) |
| build позива | Једнократно (или при промени родитеља) | Више пута (setState + родитељ) |
| initState | Нема | Има |
| dispose | Нема | Има |
| const конструктор | Препоручује се | Ограничен |
| Перформансе | Високе | Ниже (због State) |
Према анализи Flutter апликација у Google Play-у (Flutter Team, септембар 2025), пројекти са превлашћу StatelessWidget-а показују 20–25% краће време првог рендеровања (FP) у поређењу са пројектима где је већина виџета StatefulWidget. Ово се објашњава недостатком додатних трошкова за креирање и одржавање State објеката.
Користите StatelessWidget ако виџет само приказује податке добијене од родитеља и не управља никаквим унутрашњим стањем. Ако виџет треба да изврши HTTP захтев, обради кориснички унос или се претплати на ток — користите StatefulWidget или извуците логику у спољни слој управљања стањем (Bloc, Riverpod).
Оптимизација StatelessWidget-а се заснива на три принципа: const конструктори, минимално стабло виџета и правилно коришћење кључева. const конструктор омогућава Flutter-у да креира виџет једном у compile-time и поново га користи током целог животног века апликације. Ово елиминише потребу за поновним позивањем build и смањује оптерећење алокатора меморије.
Минимизација стабла виџета — други важан аспект. Сваки угнежђени StatelessWidget додаје један ниво у Element tree. Flutter мора да обиђе цело стабло при сваком рендеровању, па што је стабло дубље, то је више посла за фрејмворк. Препоручује се обједињавање једноставних виџета у један прилагођени StatelessWidget, где то побољшава читљивост без губитка перформанси.
Кључеви (Key) — трећи елемент оптимизације. При поновној изградњи листе или промени редоследа елемената, правилан key омогућава Flutter-у да упари старе и нове елементе, избегавајући поновно креирање виџета. За StatelessWidget довољно је користити ValueKey или ObjectKey, засноване на јединственим идентификаторима података.
Употреба const у конструктору StatelessWidget-а даје највећи добитак у перформансама када се виџет користи више пута у листама или понављајућим структурама. Flutter пореди нови виџет са постојећим Element-ом и, ако се тип и key поклапају, позива canUpdate. За const виџете са истим параметрима, Flutter потпуно прескаче позив build, користећи кеширани резултат.
Прва типична грешка — покушај коришћења StatelessWidget-а тамо где је потребно асинхроно ажурирање. Програмери понекад постављају HTTP захтев у конструктор StatelessWidget-а, очекујући да ће се подаци учитати при креирању. У пракси, конструктор треба да буде лаган и да не садржи нежељене ефекте. Асинхроне операције се извршавају у StatefulWidget.initState или у спољним сервисима.
Друга честа грешка — креирање тешких прорачуна унутар методе build. Пошто build може бити позиван често (чак и код StatelessWidget-а — при поновној изградњи родитеља), било какве сложене калкулације, позиви MediaQuery.of(context) без кеширања или креирање нових објеката унутар build смањују перформансе. Решење — извлачење прорачуна у засебне методе са мемоизацијом или коришћење const фабрика.
Трећа грешка — недостатак const конструктора код StatelessWidget-а који би га могао имати. Ако виџет није декларисан као const, Flutter креира нову инстанцу при сваком build родитеља, чак и ако се параметри нису променили. Ово доводи до прекомерне потрошње меморије и додатног рада garbage collector-а.
const, ако нема разлога да то не учинишKey за виџете у динамичким листамаЧесто постављана питања
StatelessWidget не може мењати своје стање након креирања — приказује само податке прослеђене кроз конструктор. StatefulWidget креира засебан објекат State, који се може мењати кроз setState, има методе животног циклуса и омогућава асинхроно ажурирање UI-ја.
Да, ако се родитељски виџет поново изгради и проследи нове параметре. StatelessWidget се не ажурира сам, али може бити поново креиран од стране родитеља са новим подацима. Flutter упоређује runtimeType и Key да одлучи да ли треба поново позвати build.
const омогућава Flutter-у да креира инстанцу виџета у compile-time и да је кешира. Ако два const виџета имају исте параметре, Flutter поново користи један елемент, потпуно прескачући позив build. Ово даје добитак у перформансама у листама и понављајућим структурама.
Flutter ће креирати нову инстанцу при сваком build родитеља, чак и ако се параметри нису променили. Ово повећава оптерећење алокатора меморије и garbage collector-а, а такође може изазвати непотребна поновна изградње дечијих виџета.
Нема ограничења. У типичној Flutter апликацији, StatelessWidget чини 50–80% свих виџета. Што је више StatelessWidget-а, то су перформансе предвидљивије и архитектура једноставнија. Flutter је оптимизован за ефикасан рад са хиљадама StatelessWidget-а у једном стаблу.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође