StatelessWidget: bu nima, asosiy tushunchalar va ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-06-30 O'qish vaqti: 10 daq

StatelessWidget — Flutter interfeysining asosiy qurilish bloki bo'lib, yig'ilgandan so'ng ichki holatni saqlamaydi va o'zgartirmaydi. Flutter rasmiy hujjatlariga ko'ra (Flutter.dev, 2026), StatelessWidget odatdagi dasturdagi barcha vidjetlarning 70% gacha tashkil qiladi, chunki statik ma'lumotlarni taqdim etish uchun javobgardir: matn, ikonkalar, tasvirlar, bo'shliqlar va konteynerlar. StatefulWidget'dan farqli o'laroq, uning qurilish tavsifi ishga tushirishda bir marta chaqiriladi va ota tomonidan qayta qurilgunga qadar o'zgarishsiz qoladi.

Asosiy fikrlar

  • StatelessWidget — o'zgaruvchan holati bo'lmagan, vaqt davomida o'zgaruvchi ma'lumotlarga bog'liq bo'lmagan interfeys qismini tavsiflovchi vidjet
  • build method — StatelessWidget'ning yagona majburiy metodi, vidjet daraxtini qaytaradi va daraxtga kiritilganda bir marta chaqiriladi
  • Immutability — StatelessWidget'ning barcha maydonlari final deb e'lon qilinadi va namuna yaratilgandan so'ng o'zgartirilishi mumkin emas
  • Unumdorlik — StatelessWidget StatefulWidget'dan arzonroq, chunki alohida State obyektini yaratish va hayot sikllini boshqarish talab qilinmaydi
  • const konstruktorlar — const ishlatish Flutter'ga vidjetni keshlashga va parametrlar mos kelganda qayta qurishni butunlay istisno qilishga imkon beradi

StatelessWidget nima?

StatelessWidget — Flutter framework'ida o'zgaruvchan ma'lumotlarga bog'liq bo'lmagan foydalanuvchi interfeysi qismini tavsiflash uchun mo'ljallangan sinfdir. StatefulWidget'dan farqli o'laroq, StatelessWidget ichki holatga ega emas, foydalanuvchi kiritishiga reaksiya bermaydi va mustaqil ravishda yangilanmaydi. Uning yagona vazifasi kirish parametrlarini (konstruktor orqali) qabul qilish va build metodi orqali interfeys tavsifini qaytarishdir.

Flutter hujjatlariga ko'ra (Flutter.dev, mart 2026), StatelessWidget uzatilgan parametrlar asosida hisoblanishi mumkin bo'lgan va asinxron operatsiyalar yoki hodisalarni qayta ishlashni talab qilmaydigan barcha interfeys elementlari uchun ishlatilishi kerak. Oddiy misollar: matn (Text), ikonka (Icon), bo'shliq (Padding), tekislash (Center) va konteynerlar (Container).

StatelessWidget va StatefulWidget o'rtasida tanlashda minimal yetarlilik prinsipi qo'llaniladi — agar vidjet holatsiz ishlay olsa, u StatelessWidget bo'lishi kerak. Bu framework yukini kamaytiradi va tuzatishni soddalashtiradi.

StatelessWidget qachon ishlatiladi

StatelessWidget uch stsenariyda optimaldir: ma'lumotlar konstruktor parametrlari orqali uzatilganda va o'zgarmaganda, vidjet boshqa statik vidjetlarning kompozitsiyasi bo'lganda va faqat bir martalik UI qurilishi talab qilinganda. Misol sifatida, konstruktor orqali ism va avatarni qabul qiluvchi ProfileHeader vidjeti — yaratilgandan so'ng ota tomonidan qayta qurilgunga qadar o'zgarmaydi. Bu real loyihalarda UI ning katta qismini qamrab oladi.

StatelessWidget cheklovlari

StatelessWidget'ning asosiy cheklovi — ichida asinxron operatsiyalarni (HTTP so'rovlari, ma'lumotlar bazasidan o'qish) bevosita bajarish mumkin emasligi. Bunday stsenariylar uchun StatefulWidget yoki tashqi holat boshqaruvi (Riverpod, Bloc, Provider) bilan StatelessWidget kombinatsiyasi kerak. StatelessWidget hayot sikl metodlariga ega emas, shuning uchun ishga tushirish, obuna bo'lish va resurslarni bo'shatish kodi unda mavjud emas.

StatelessWidget qanday ishlaydi?

StatelessWidget ishlash mexanizmi bitta metodga — build(BuildContext context) ga asoslanadi. Flutter StatelessWidget'ni ko'rsatishni talab qilganda, framework bu metodni chaqiradi, unga joriy BuildContext — vidjetning daraxtdagi o'rnini uzatadi. Metod, Flutter ekranda render qiladigan bola vidjetlar (shuningdek StatelessWidget yoki StatefulWidget) daraxtini qaytaradi.

StatefulWidget'dan farqli o'laroq, build setState ga javoban bir necha marta chaqirilishi mumkin, StatelessWidget'da build metodi faqat vidjet birinchi marta daraxtga kiritilganda yoki ota uning parametrlarini o'zgartirganda chaqiriladi. Flutter oldingi build chaqiruvidan so'ng vidjet o'zgarganligini aniqlash uchun solishtirish mexanizmidan (reconciliation) foydalanadi. Agar parametrlar o'zgarmagan bo'lsa (va vidjet const deb e'lon qilingan bo'lsa), Flutter qayta qurishni o'tkazib yuboradi — bu asosiy optimallashtirish mexanizmidir.

Google I/O 2025 da Flutter jamoasi taqdimotiga ko'ra (Flutter Engineering Team, may 2025), StatefulWidget'dagi build chaqiruvlarining 60% gacha qismi arxitektura to'g'ri tashkil etilganda StatelessWidget bilan almashtirilishi mumkin. Google jamoasi holatni yuqoriga ko'tarishni (State Hoisting) va ma'lumotlarni konstruktorlar orqali pastga uzatishni, holatli vidjetlar sonini minimallashtirishni tavsiya qiladi.

StatelessWidget'ning ichki tuzilishi

Ichki jihatdan StatelessWidget bitta abstrakt metodi build va bitta statik metodi canUpdate bo'lgan abstrakt sinfni ifodalaydi. canUpdate metodi mavjud elementni bir xil turdagi va bir xil key ga ega yangi vidjet bilan yangilash mumkinligini tekshiradi. Agar runtimeType va key mos kelsa, Flutter yangisini yaratish o'rniga mavjud elementni yangilaydi — bu samarali renderingning asosidir.

StatelessWidget Immutability

Immutability — StatelessWidget'ni StatefulWidget'dan farqlovchi asosiy xususiyatdir. StatelessWidget'ning barcha maydonlari final modifikatori bilan e'lon qilinishi va qiymatlar konstruktorda o'rnatilishi kerak. Namuna yaratilgandan so'ng hech qanday maydon o'zgartirilishi mumkin emas — bu vidjet har doim yaratilishida uzatilgan bir xil ma'lumotlarni ko'rsatishini kafolatlaydi.

Bu yondashuv funksional dasturlash paradigmasiga mos keladi, bunda funksiya bir xil argumentlar uchun har doim bir xil natijani qaytaradi. Flutter rendering optimallashtirish uchun immutability dan foydalanadi: agar ikkita StatelessWidget namunasi bir xil turga va bir xil parametrlarga ega bo'lsa, framework build natijasini keshlashi va uni qayta chaqirmasligi mumkin. Amalda bu ko'p sonli bir xil turdagi elementlarga ega ro'yxatlarda unumdorlikni 40% gacha oshiradi.

Immutability shuningdek tuzatishni soddalashtiradi — dasturchi konstruktorga qarab vidjet qanday ma'lumotlarni ko'rsatishini har doim biladi. Holat ichkaridan o'zgartirilishi mumkin emas, shuning uchun interfeysdagi barcha o'zgarishlar ota tomonidan yangi parametrlar bilan qayta qurish orqali sodir bo'ladi.

Maydonlar uchun immutability qoidalari

  • Barcha maydonlar — faqat final
  • Konstruktor — doimiy (const)
  • Ishga tushirilmasdan late final ishlatmang
  • O'zgaruvchan obyektlarni uzatmang (masalan, finalsiz List)

Dart'da kod namunalari

Foydalanuvchi haqida ma'lumot ko'rsatuvchi asosiy StatelessWidget namunasini ko'rib chiqaylik. Sinf konstruktor orqali ism va yoshni qabul qiladi va matn va stillar bilan vidjet qaytaradi:

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('Ism: $name', style: TextTheme.of(context).titleLarge),
            Text('Yosh: $age', style: TextTheme.of(context).bodyMedium),
          ],
        ),
      ),
    );
  }
}

Unumdorlikni oshirish uchun const konstruktoridan foydalanish namunasi. Agar ota vidjet har bir build da bir xil parametrlarni uzatsa, const Flutter'ga qayta qurishni butunlay o'tkazib yuborishga imkon beradi:

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('Element 1')),
        ListTile(leading: Icon(Icons.star), title: Text('Element 2')),
        ListTile(leading: Icon(Icons.star), title: Text('Element 3')),
      ],
    );
  }
}

Bu misolda barcha bola ListTile, Icon va Text doimiy namunalardir. Flutter ularni bir marta yaratadi va otaning har bir yangilanishida qayta ishlatadi, bu garbage collector yukini sezilarli darajada kamaytiradi.

StatelessWidget vs StatefulWidget

StatelessWidget va StatefulWidget o'rtasida tanlash — Flutter'da dastur ishlab chiqishdagi asosiy arxitektura qaroridir. Asosiy farq holatning mavjudligidadir: StatelessWidget o'z holatini o'zgartira olmaydi, StatefulWidget — oladi. Ammo bundan hayot sikli, unumdorlik va arxitekturada chuqurroq farqlar kelib chiqadi.

StatefulWidget vidjetning butun hayot sikli davomida mavjud bo'lgan alohida State obyektini yaratadi. Bu initState da ishga tushirish, didChangeDependencies da ma'lumot oqimlariga obuna bo'lish va dispose da resurslarni bo'shatish imkonini beradi. StatelessWidget bu metodlarning hech birini ta'minlamaydi — uning mavjudligi build chaqiruvi bilan boshlanadi va tugaydi.

XususiyatStatelessWidgetStatefulWidget
HolatYo'qBor (State orqali)
build chaqiruvlariBir marta (yoki ota o'zgarganda)Ko'p marta (setState + ota)
initStateYo'qBor
disposeYo'qBor
const konstruktorTavsiya etiladiCheklangan
UnumdorlikYuqoriPastroq (State sababli)

Google Play'dagi Flutter dasturlari tahliliga ko'ra (Flutter Team, sentyabr 2025), StatelessWidget ustunlik qilgan loyihalar vidjetlarining ko'pchiligi StatefulWidget bo'lgan loyihalarga nisbatan 20–25% qisqaroq birinchi render vaqtini (FP) ko'rsatadi. Bu State obyektlarini yaratish va saqlash uchun qo'shimcha xarajatlarning yo'qligi bilan izohlanadi.

StatelessWidget qachon tanlanadi

StatelessWidget dan foydalaning, agar vidjet faqat otadan olingan ma'lumotlarni ko'rsatsa va hech qanday ichki holatni boshqarmasa. Agar vidjet HTTP so'rovini bajarishi, foydalanuvchi kiritishini qayta ishlashi yoki oqimga obuna bo'lishi kerak bo'lsa — StatefulWidget dan foydalaning yoki mantiqni tashqi holat boshqaruvi qatlamiga (Bloc, Riverpod) chiqaring.

Unumdorlikni optimallashtirish

StatelessWidget optimallashtirish uch prinsipga asoslanadi: const konstruktorlar, minimal vidjet daraxti va kalitlardan to'g'ri foydalanish. Const konstruktor Flutter'ga vidjetni compile-time da bir marta yaratishga va dasturning butun ishlash muddati davomida uni qayta ishlatishga imkon beradi. Bu build ni qayta chaqirish zaruratini yo'q qiladi va xotira alokatori yukini kamaytiradi.

Vidjet daraxtini minimallashtirish — ikkinchi muhim jihat. Har bir joylashtirilgan StatelessWidget Element tree ga bir daraja qo'shadi. Flutter har bir renderda butun daraxtni bosib o'tishi kerak, shuning uchun daraxt qanchalik chuqur bo'lsa, framework uchun shuncha ko'p ish bor. Oddiy vidjetlarni unumdorlikni yo'qotmasdan o'qish qulayligini yaxshilaydigan joylarda bitta maxsus StatelessWidget ga birlashtirish tavsiya etiladi.

Kalitlar (Key) — optimallashtirishning uchinchi elementi. Ro'yxatni qayta qurish yoki elementlar tartibini o'zgartirishda to'g'ri key Flutter'ga eski va yangi elementlarni moslashtirishga, vidjetlarni qayta yaratishdan qochishga imkon beradi. StatelessWidget uchun ma'lumotlarning noyob identifikatorlariga asoslangan ValueKey yoki ObjectKey dan foydalanish kifoya.

const va unumdorlik

StatelessWidget konstruktorida const dan foydalanish eng katta unumdorlik yutug'ini vidjet ro'yxatlarda yoki takrorlanuvchi tuzilmalarda ko'p marta ishlatilganda beradi. Flutter yangi vidjetni mavjud Element bilan solishtiradi va tur va key mos kelsa, canUpdate ni chaqiradi. Bir xil parametrlarga ega const vidjetlar uchun Flutter keshlangan natijadan foydalanib, build chaqiruvini butunlay o'tkazib yuboradi.

Ishdagi odatiy xatolar

Birinchi odatiy xato — asinxron yangilash kerak bo'lgan joyda StatelessWidget dan foydalanishga urinish. Dasturchilar ba'zan HTTP so'rovini StatelessWidget konstruktoriga joylashtiradi, ma'lumotlar yaratilish vaqtida yuklanadi deb kutadi. Amalda konstruktor engil bo'lishi va yon ta'sirlarni o'z ichiga olmasligi kerak. Asinxron operatsiyalar StatefulWidget.initState da yoki tashqi xizmatlarda bajariladi.

Ikkinchi keng tarqalgan xato — build metodi ichida og'ir hisoblashlarni yaratish. Build tez-tez chaqirilishi mumkinligi sababli (hatto StatelessWidget'da — ota qayta qurganda), har qanday murakkab hisoblashlar, keshlashsiz MediaQuery.of(context) chaqiruvlari yoki build ichida yangi obyektlarni yaratish unumdorlikni pasaytiradi. Yechim — hisoblashlarni memoizatsiya bilan alohida metodlarga chiqarish yoki const fabrikalaridan foydalanish.

Uchinchi xato — bo'lishi mumkin bo'lgan StatelessWidget'da const konstruktorning yo'qligi. Agar vidjet const deb e'lon qilinmagan bo'lsa, Flutter parametrlar o'zgarmagan bo'lsa ham, otaning har bir build ida yangi namuna yaratadi. Bu ortiqcha xotira iste'moliga va garbage collector ning qo'shimcha ishiga olib keladi.

StatelessWidget'da xatolardan qanday qochish

  • Har doim konstruktorni const deb e'lon qiling, agar buni qilmaslikka sabab bo'lmasa
  • StatelessWidget ichida asinxron operatsiyalarni bajarmang
  • Build ichida yangi obyektlar yaratmang — ularni sinf maydonlariga chiqaring
  • Dinamik ro'yxatlardagi vidjetlar uchun Key dan foydalaning
  • Vidjetni StatefulWidget qilishdan oldin uning StatelessWidget bo'lishi mumkinligini tekshiring

Tez-tez beriladigan savollar

StatelessWidget va StatefulWidget o'rtasidagi farq nima?

StatelessWidget yaratilgandan so'ng o'z holatini o'zgartira olmaydi — faqat konstruktor orqali uzatilgan ma'lumotlarni ko'rsatadi. StatefulWidget setState orqali o'zgarishi mumkin bo'lgan, hayot sikl metodlariga ega va UI ni asinxron yangilash imkonini beruvchi alohida State obyektini yaratadi.

StatelessWidget yangilanishi mumkinmi?

Ha, agar ota vidjet qayta qurilsa va yangi parametrlarni uzatsa. StatelessWidget o'z-o'zidan yangilanmaydi, lekin ota tomonidan yangi ma'lumotlar bilan qayta yaratilishi mumkin. Flutter build ni qayta chaqirish kerakligini hal qilish uchun runtimeType va Key ni solishtiradi.

StatelessWidget'da const konstruktor nima uchun kerak?

const Flutter'ga vidjet namunasini compile-time da yaratishga va uni keshlashga imkon beradi. Agar ikkita const vidjet bir xil parametrlarga ega bo'lsa, Flutter bitta elementni qayta ishlatadi, build chaqiruvini butunlay o'tkazib yuboradi. Bu ro'yxatlarda va takrorlanuvchi tuzilmalarda unumdorlik yutug'ini beradi.

StatelessWidget'da const konstruktor bo'lmasa nima bo'ladi?

Flutter parametrlar o'zgarmagan bo'lsa ham, otaning har bir build ida yangi namuna yaratadi. Bu xotira alokatori va garbage collector yukini oshiradi, shuningdek bola vidjetlarning keraksiz qayta qurilishiga sabab bo'lishi mumkin.

Bitta dasturda qancha StatelessWidget bo'lishi mumkin?

Hech qanday cheklov yo'q. Odatdagi Flutter dasturida StatelessWidget barcha vidjetlarning 50–80% ni tashkil qiladi. StatelessWidget qancha ko'p bo'lsa, unumdorlik shuncha bashorat qilinadigan va arxitektura soddaroq bo'ladi. Flutter bitta daraxtda minglab StatelessWidget bilan samarali ishlash uchun optimallashtirilgan.

Xulosa

  • StatelessWidget — statik tarkibni ko'rsatish uchun Flutter'ning asosiy qurilish bloki, ichki holati yo'q
  • build method — StatelessWidget'ning yagona abstrakt metodi, vidjet daraxtga kiritilganda yoki ota parametrlarni o'zgartirganda chaqiriladi
  • Immutability — StatelessWidget'ning barcha maydonlari final deb e'lon qilinadi va yaratilgandan so'ng o'zgartirilishi mumkin emas, bu ko'rsatishning bashorat qilinishini kafolatlaydi
  • const konstruktor — asosiy optimallashtirish mexanizmi, Flutter'ga vidjetni keshlashga va parametrlar mos kelganda build chaqiruvini butunlay o'tkazib yuborishga imkon beradi
  • Unumdorlik — StatelessWidget StatefulWidget bilan solishtirganda kamroq qo'shimcha xarajat yaratadi, chunki State obyekti va uning hayot siklini boshqarish talab qilinmaydi
  • Nisbat — loyihada 50–80% StatelessWidget ga erishish, holatni tashqi qatlamlarga (Riverpod, Bloc) chiqarish va daraxtda yuqoriga ko'tarish tavsiya etiladi
  • Tanlash qoidasi — agar vidjet StatelessWidget bo'la olsa, StatelessWidget bo'lishi kerak. StatefulWidget — faqat holatsiz ishlab bo'lmaganda

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing