StatelessWidget: шта је то, кључни појмови и принцип рада

Аутор: IT Sectr Објављено: 2026-06-30 Време читања: 10 мин

StatelessWidget — фундаментални градивни блок интерфејса Flutter-а, који не чува и не мења унутрашње стање након изградње. Према званичној документацији Flutter-а (Flutter.dev, 2026), StatelessWidget чини до 70% свих виџета у типичној апликацији, јер је одговоран за статички приказ података: текст, иконе, слике, размаке и контејнере. За разлику од StatefulWidget-а, његов опис изградње позива се једнократно при иницијализацији и остаје непромењен до поновне изградње од стране родитеља.

Главне ствари

  • StatelessWidget — виџет без променљивог стања, који описује део интерфејса независан од података који се мењају током времена
  • build method — једина обавезна метода StatelessWidget-а, враћа стабло виџета и позива се једнократно при уграђивању у стабло
  • Имутабилност — сва поља StatelessWidget-а се декларишу као final и не могу се мењати након креирања инстанце
  • Перформансе — StatelessWidget је јефтинији од StatefulWidget-а, јер не захтева креирање засебног објекта State и управљање животним циклусом
  • const конструктори — употреба const омогућава Flutter-у да кешира виџет и потпуно искључи поновну изградњу при поклапању параметара

Шта је StatelessWidget?

StatelessWidget — класа у Flutter фрејмворку намењена за описивање дела корисничког интерфејса који не зависи од променљивих података. За разлику од StatefulWidget-а, StatelessWidget нема унутрашње стање, не реагује на кориснички унос и не ажурира се самостално. Његов једини задатак је да прими улазне параметре (кроз конструктор) и врати опис интерфејса кроз метод build.

Према документацији Flutter-а (Flutter.dev, март 2026), StatelessWidget треба користити за све елементе интерфејса који се могу израчунати на основу прослеђених параметара и не захтевају асинхроне операције или обраду догађаја унутар себе. Типични примери: приказ текста (Text), иконе (Icon), размака (Padding), поравнање (Center) и контејнера (Container).

При избору између StatelessWidget-а и StatefulWidget-а примењује се принцип минималне довољности — ако виџет може да ради без стања, треба да буде StatelessWidget. Ово смањује оптерећење фрејмворка и поједностављује отклањање грешака.

Када користити StatelessWidget

StatelessWidget је оптималан у три сценарија: када се подаци прослеђују кроз параметре конструктора и не мењају се, када је виџет композиција других статичких виџета и када је потребна само једнократна изградња UI. Пример је виџет ProfileHeader, који прима име и аватар кроз конструктор — након креирања не мења се до поновне изградње од стране родитеља. Ово покрива већину UI-ја у реалним пројектима.

Ограничења StatelessWidget-а

Главно ограничење StatelessWidget-а — немогућност извођења асинхроних операција (HTTP захтеви, читање из базе) директно унутар себе. За такве сценарије потребан је StatefulWidget или комбинација StatelessWidget-а са спољним управљањем стањем (Riverpod, Bloc, Provider). StatelessWidget нема методе животног циклуса, па код иницијализације, претплате и ослобађања ресурса није доступан у њему.

Како ради 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-а

Унутра, StatelessWidget представља апстрактну класу са једином апстрактном методом build и једном статичком методом canUpdate, која проверава да ли се постојећи елемент може ажурирати новим виџетом истог типа и са истим key. Ако се runtimeType и key поклапају, Flutter ажурира постојећи елемент уместо креирања новог — ово је основа ефикасног рендеровања.

Имутабилност StatelessWidget-а

Имутабилност — кључно својство StatelessWidget-а које га разликује од StatefulWidget-а. Сва поља StatelessWidget-а морају бити декларисана са модификатором final, а вредности се постављају у конструктору. Након креирања инстанце, ниједно поље не може бити промењено — ово гарантује да виџет увек приказује исте податке који су му прослеђени при креирању.

Овај приступ одговара функционалној парадигми програмирања, где функција увек враћа исти резултат за исте аргументе. Flutter користи имутабилност за оптимизацију рендеровања: ако две инстанце StatelessWidget-а имају исти тип и исте параметре, фрејмворк може кеширати резултат build и не позивати га поново. У пракси, ово даје повећање перформанси до 40% у листама са много елемената истог типа.

Имутабилност такође поједностављује отклањање грешака — програмер увек зна које податке виџет приказује гледајући његов конструктор. Стање се не може променити изнутра, па се све промене интерфејса дешавају кроз поновну изградњу родитеља са новим параметрима.

Правила имутабилности за поља

  • Сва поља — само final
  • Конструктор — константан (const)
  • Не користити late final без иницијализације
  • Не прослеђивати променљиве објекте (нпр. List без final)

Примери кода у Dart-у

Размотримо основни пример StatelessWidget-а који приказује информације о кориснику. Класа прима име и старост кроз конструктор и враћа виџет са текстом и стиловима:

dart
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-у да потпуно прескочи поновну изградњу:

dart
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 vs StatefulWidget

Избор између StatelessWidget-а и StatefulWidget-а — фундаментална архитектонска одлука при развоју у Flutter-у. Основна разлика је у поседовању стања: StatelessWidget не може мењати своје стање, StatefulWidget — може. Међутим, из овога произилазе дубље разлике у животном циклусу, перформансама и архитектури.

StatefulWidget креира засебан објекат State, који постоји током целог животног циклуса виџета. Ово омогућава иницијализацију у initState, претплату на токове података у didChangeDependencies и ослобађање ресурса у dispose. StatelessWidget не пружа ниједну од ових метода — његово постојање почиње и завршава се позивом build.

КарактеристикаStatelessWidgetStatefulWidget
СтањеНемаИма (кроз State)
build позиваЈеднократно (или при промени родитеља)Више пута (setState + родитељ)
initStateНемаИма
disposeНемаИма
const конструкторПрепоручује сеОграничен
ПерформансеВисокеНиже (због State)

Према анализи Flutter апликација у Google Play-у (Flutter Team, септембар 2025), пројекти са превлашћу StatelessWidget-а показују 20–25% краће време првог рендеровања (FP) у поређењу са пројектима где је већина виџета StatefulWidget. Ово се објашњава недостатком додатних трошкова за креирање и одржавање State објеката.

Када изабрати StatelessWidget

Користите StatelessWidget ако виџет само приказује податке добијене од родитеља и не управља никаквим унутрашњим стањем. Ако виџет треба да изврши HTTP захтев, обради кориснички унос или се претплати на ток — користите StatefulWidget или извуците логику у спољни слој управљања стањем (Bloc, Riverpod).

Оптимизација перформанси

Оптимизација StatelessWidget-а се заснива на три принципа: const конструктори, минимално стабло виџета и правилно коришћење кључева. const конструктор омогућава Flutter-у да креира виџет једном у compile-time и поново га користи током целог животног века апликације. Ово елиминише потребу за поновним позивањем build и смањује оптерећење алокатора меморије.

Минимизација стабла виџета — други важан аспект. Сваки угнежђени StatelessWidget додаје један ниво у Element tree. Flutter мора да обиђе цело стабло при сваком рендеровању, па што је стабло дубље, то је више посла за фрејмворк. Препоручује се обједињавање једноставних виџета у један прилагођени StatelessWidget, где то побољшава читљивост без губитка перформанси.

Кључеви (Key) — трећи елемент оптимизације. При поновној изградњи листе или промени редоследа елемената, правилан key омогућава Flutter-у да упари старе и нове елементе, избегавајући поновно креирање виџета. За StatelessWidget довољно је користити ValueKey или ObjectKey, засноване на јединственим идентификаторима података.

const и перформансе

Употреба 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-а.

Како избећи грешке у StatelessWidget-у

  • Увек деклариши конструктор као const, ако нема разлога да то не учиниш
  • Не извршавај асинхроне операције унутар StatelessWidget-а
  • Не креирај нове објекте унутар build — извуци их у поља класе
  • Користи Key за виџете у динамичким листама
  • Провери да ли виџет може бити StatelessWidget пре него што га направиш StatefulWidget

Често постављана питања

Која је разлика између StatelessWidget-а и StatefulWidget-а?

StatelessWidget не може мењати своје стање након креирања — приказује само податке прослеђене кроз конструктор. StatefulWidget креира засебан објекат State, који се може мењати кроз setState, има методе животног циклуса и омогућава асинхроно ажурирање UI-ја.

Може ли се StatelessWidget ажурирати?

Да, ако се родитељски виџет поново изгради и проследи нове параметре. StatelessWidget се не ажурира сам, али може бити поново креиран од стране родитеља са новим подацима. Flutter упоређује runtimeType и Key да одлучи да ли треба поново позвати build.

Зашто је потребан const конструктор у StatelessWidget-у?

const омогућава Flutter-у да креира инстанцу виџета у compile-time и да је кешира. Ако два const виџета имају исте параметре, Flutter поново користи један елемент, потпуно прескачући позив build. Ово даје добитак у перформансама у листама и понављајућим структурама.

Шта се дешава ако StatelessWidget нема const конструктор?

Flutter ће креирати нову инстанцу при сваком build родитеља, чак и ако се параметри нису променили. Ово повећава оптерећење алокатора меморије и garbage collector-а, а такође може изазвати непотребна поновна изградње дечијих виџета.

Колико StatelessWidget-а може бити у једној апликацији?

Нема ограничења. У типичној Flutter апликацији, StatelessWidget чини 50–80% свих виџета. Што је више StatelessWidget-а, то су перформансе предвидљивије и архитектура једноставнија. Flutter је оптимизован за ефикасан рад са хиљадама StatelessWidget-а у једном стаблу.

Закључци

  • StatelessWidget — основни градивни блок Flutter-а за приказ статичког садржаја, без унутрашњег стања
  • build method — једина апстрактна метода StatelessWidget-а, позива се при уграђивању виџета у стабло или при промени параметара од стране родитеља
  • Имутабилност — сва поља StatelessWidget-а се декларишу као final и не могу се мењати након креирања, што гарантује предвидљивост приказа
  • const конструктор — кључни механизам оптимизације, омогућава Flutter-у да кешира виџет и потпуно прескочи позив build при поклапању параметара
  • Перформансе — StatelessWidget ствара мање додатних трошкова у поређењу са StatefulWidget-ом, јер не захтева објекат State и управљање његовим животним циклусом
  • Однос — препоручује се тежња ка 50–80% StatelessWidget-а у пројекту, извлачењем стања у спољне слојеве (Riverpod, Bloc) и подизањем више у стаблу
  • Правило избора — ако виџет може бити StatelessWidget, треба да буде StatelessWidget. StatefulWidget — само када се без стања не може

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође