setState() — mohiyati, ishlash mexanizmi va qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-07-01 O'qish vaqti: 9 daq

setState() — Flutterdagi State sinfining asosiy metodi bo'lib, frameworkka ma'lumotlar o'zgargani haqida xabar beradi va interfeysni qayta qurishni boshlaydi. Rasmiy Flutter hujjatlariga ko'ra (Flutter.dev, 2026), setState StatefulWidgetdagi reaktivlikning asosiy mexanizmidir: uni chaqirmasdan UI State maydonlaridagi o'zgarishlarni bilmaydi va avvalgi holatda qoladi. Metod VoidCallback qabul qiladi, uning ichida dasturchi o'zgaruvchan maydonlarni o'zgartiradi, shundan so'ng Flutter avtomatik ravishda widgetni qayta qurish uchun buildni chaqiradi.

Asosiy ma'lumotlar

  • setState() — widgetni dirty (iflos) deb belgilovchi va keyingi kadrda UI qayta qurilishini rejalashtiruvchi State metodi
  • Callback — setState VoidCallback qabul qiladi, uning ichida interfeysga ta'sir qiluvchi State maydonlarining barcha o'zgarishlari bo'lishi kerak
  • Asinxronlik — setTimeout yoki Future setState ichida sinxronlikni kafolatlamaydi; awaitdan keyingi mutatsiyalar boshqa setState ichida bo'lishi kerak
  • Unumdorlik — har bir setState chaqiruvi butun widgetni qayta quradi; minimallashtirish uchun bolaviy widgetlar uchun const dan foydalaning
  • mounted — asinxron callbacklarda setState chaqirishdan oldin mountedni albatta tekshiring, aks holda — istisno

setState() nima?

setState() — Flutterdagi State sinfiga kiritilgan, frameworkka widgetning ichki holati o'zgargani va UI qayta qurilishi zarurligi haqida xabar berish uchun mo'ljallangan metod. setState chaqirilmasa, Flutter o'zgarishlarni bilmaydi — State maydonlari o'zgartirilgan bo'lsa ham, interfeys ota tomonidan navbatdagi majburiy qayta qurishgacha o'zgarmay qoladi.

Metodning imzosi: void setState(VoidCallback fn). Callback setState ichida sinxron tarzda bajariladi va faqat uning tugashidan so'ng State dirty deb belgilanadi. Bu barcha o'zgarishlarning qayta qurishdan oldin atomik tarzda qo'llanilishini kafolatlaydi. Dart Language Specificationga ko'ra (Dart Team, 2026), setState atomikligi build qisman yangilangan holatni ko'rishi mumkin bo'lgan poyga holatining oldini oladi.

setState argument qabul qilmaydi, qiymat qaytarmaydi va bekor qilinishi mumkin emas. Bu State sinfining final (sealed) metodidir. Dasturchi uning xatti-harakatini o'zgartira olmaydi — faqat maqsadli foydalanishi mumkin. setState ni State dan tashqarida (masalan, boshqa sinfdan) chaqirish mumkin emas, chunki metod State sinfida e'lon qilingan.

setState holatni o'zgartirmaydi — siz o'zgartirasiz

Keng tarqalgan noto'g'ri tushuncha — setState o'zi holatni o'zgartiradi deb o'ylash. Bu to'g'ri emas. setState faqat uzatilgan callbackni chaqiradi (unda dasturchi maydonlarni o'zgartiradi) va keyin frameworkka build zarurligi haqida signal beradi. Callback majburiy — null yoki bo'sh callback uzatish xatoga olib keladi.

setState() qanday ishlaydi?

setState() ishlash mexanizmini to'rt bosqichga bo'lish mumkin. Birinchi — metodni callback bilan chaqirish. Ikkinchi — callbackni sinxron bajarish, uning ichida State maydonlari o'zgartiriladi. Uchinchi — State maxsus _dirty maydonida dirty (iflos) deb belgilanadi. To'rtinchi — joriy mikrotopshiriq (microtask) oxirida Flutter barcha dirty-elementlarni aylanib chiqadi va ularning buildini daraxtda paydo bo'lish tartibida chaqiradi.

Muhim detal: setState buildni darhol chaqirmaydi. Flutter to'plamli yangilash strategiyasidan foydalanadi: barcha dirty-elementlar yig'iladi va bir kadrda qayta quriladi. Bu shuni anglatadiki, agar setState bir sinxron blok ichida bir necha marta chaqirilgan bo'lsa, build faqat bir marta — barcha o'zgarishlar tugagandan so'ng bajariladi. Bunday optimallashtirish bir kadrda ko'p marta qayta qurishning oldini oladi.

Flutter Engine Team ma'lumotlariga ko'ra (Google, 2025), dirty-flag mexanizmi BuildOwner._dirtyElements orqali o'tishga asoslangan. Har bir dirty StatefulElement ro'yxatga qo'shiladi va kadr yangilash bosqichida qayta ishlanadi. Agar widget ishlov berishdan oldin daraxtdan olib tashlangan bo'lsa, u avtomatik ravishda dirty-elementlar ro'yxatidan chiqariladi.

setState kafolatlari

  • Callback dirty belgilashdan oldin sinxron bajariladi
  • build har bir kadrda bir martadan ko'p emas chaqiriladi (hatto bir nechta setState bo'lsa ham)
  • UI yangilanishi keyingi kadrda sodir bo'ladi (odatda 60 FPS da ~16ms)
  • disposedan keyin chaqirish taqiqlangan — istisno tashlanadi
  • build vaqtida setState chaqirish taqiqlangan — cheksiz sikl

Dart tilida kod misollari

setState() ning hisoblagichni oshirish bilan asosiy namunasi. To'g'ri foydalanishni ko'rsatadi: callback ichida maydonni o'zgartirish:

dart
class _CounterState extends State<CounterWidget> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++; // callback ichida maydon mutatsiyasi
    });
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _increment,
      child: Text('$_count'),
    );
  }
}

Matn maydoni va kontroller bilan misol — parol ko'rinishini boshqarish uchun setState():

dart
class _PasswordFieldState extends State<PasswordField> {
  bool _obscured = true;
  final _controller = TextEditingController();

  void _toggleVisibility() {
    setState(() {
      _obscured = !_obscured;
    });
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      obscureText: _obscured,
      decoration: InputDecoration(
        suffixIcon: IconButton(
          icon: Icon(_obscured ? Icons.visibility : Icons.visibility_off),
          onPressed: _toggleVisibility,
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

Ushbu misolda setState() faqat _obscured boolean maydonini o'zgartiradi, bu esa TextFieldning yangi ikonka va ko'rsatish rejimi bilan qayta qurilishiga sabab bo'ladi. Matn kontrolleri qayta yaratilmaydi — u initStateda bir marta ishga tushiriladi va disposeda bo'shatiladi.

Bir setStateda bir nechta mutatsiyalar

Agar bir nechta maydonni o'zgartirish kerak bo'lsa, barcha o'zgarishlar bir setState ichida amalga oshiriladi. Bu buildning izchil holatni ko'rishini kafolatlaydi:

dart
setState(() {
  _isLoading = false;
  _items = newItems;
  _error = null;
});

Uch maydon bir callbackda o'zgartiriladi — build bir marta bajariladi va barcha o'zgarishlarni bir vaqtda ko'radi. Agar har bir chaqiruv alohida setState bo'lsa, build dirty-elementlarning to'plamli qayta ishlanishi tufayli baribir bir marta bajarilardi.

Asinxronlik va setState

setState() ning eng muhim nuanslaridan biri — uning asinxron operatsiyalar bilan xatti-harakati. setState callbacki sinxron bajariladi, lekin uning ichida await chaqirilsa, awaitdan keyingi kod setState ishini tugatganidan so'ng bajariladi. Bu shuni anglatadiki, awaitdan keyingi maydon o'zgarishlari joriy setState tomonidan qamrab olinmaydi.

To'g'ri yondashuv: asinxron operatsiya setState tashqarisida bajariladi va setState uning tugashidan keyin chaqiriladi. Natijani olish va setState chaqiruvi orasidagi barcha kod awaitdan keyin sinxron kontekstda bajariladi:

dart
// TO'G'RI: await setState tashqarisida
Future<void> _loadData() async {
  final result = await ApiService.fetchData();
  setState(() {
    _data = result;
    _isLoading = false;
  });
}

// XATO: await setState ichida — yangilanish kafolati yo'q
void _loadDataWrong() {
  setState(() async {
    _data = await ApiService.fetchData(); // setState await tugashidan oldin qaytadi
    _isLoading = false; // bu kod setState tomonidan qamrab olinmaydi
  });
}

Flutter hujjatlariga ko'ra (Dart async patterns, 2026), setState ga async-callback uzatish antipattern hisoblanadi, chunki setState VoidCallback (sinxron funksiya) kutadi, async funksiya esa e'tiborga olinmaydigan Future qaytaradi. Bunday callbackda birinchi awaitdan keyingi o'zgarishlar framework tomonidan to'g'ri qayta ishlanmaydi.

Asinxron stsenariylarda mounted tekshiruvi

Asinxron operatsiyadan keyin setState() chaqirishdan oldin har doim mountedni tekshiring:

dart
if (mounted) {
  setState(() => _data = data);
}

Agar widget asinxron operatsiyani bajarish vaqtida daraxtdan olib tashlangan bo'lsa, mounted false bo'ladi va setState chaqirilmaydi. Bu istisno va resurs oqishining oldini oladi.

Unumdorlik va optimallashtirish

setState() — qulay, lekin o'ylamasdan ishlatilsa, potensial qimmat mexanizm. Har bir setState chaqiruvi butun widgetni va uning barcha avlodlarini (agar ular const bo'lmasa) qayta quradi. Chuqur daraxtlarda yoki tez-tez chaqiruvlarda bu FPS tushishiga olib kelishi mumkin.

Asosiy optimallashtirish strategiyalari: qayta qurish maydonini minimallashtirish (o'zgaruvchan UI qismlarini alohida StatefulWidgetlarga ajratish), o'zgarmas avlodlar uchun const ishlatish va faqat kichik UX detali o'zgarganda ota widgetlarda setState chaqirishdan qochish. Agar holat yuqori chastota bilan yangilansa (animatsiya, ma'lumot oqimi), AnimatedBuilder yoki ValueListenableBuilder ni ko'rib chiqing.

Flutter Performance Best Practices ma'lumotlariga ko'ra (Flutter.dev, fevral 2026), real ilovalarni profillash shuni ko'rsatadiki, barcha setState chaqiruvlarining 40% gacha const bolaviy widgetlar yoki reaktiv builderlar (StreamBuilder, FutureBuilder) bilan almashtirilishi mumkin. Bu o'rtacha kadr qurish vaqtini 15–25% ga kamaytiradi.

Qachon setState ortiqcha

StsenariyAlternativAfzallik
AnimatsiyaAnimatedBuilderFaqat animatsiyalashtirilgan widgetni qayta quradi
Ma'lumot oqimiStreamBuilderOqimning har bir elementiga reaksiya beradi
Kelajakdagi natijaFutureBuilderYuklash/xato holatlarini boshqaradi
Lokal qiymatValueListenableBuilderBitta qiymat o'zgarishiga reaksiya beradi

setState alternativlari

Ko'p qirraliligiga qaramay setState(), katta loyihalarda asosan lokal holat uchun qo'llaniladi. Global yoki umumiy holat uchun har biri setState ni almashtiradigan yoki o'rab oluvchi ixtisoslashgan yechimlar ishlatiladi.

Provider ChangeNotifier + notifyListeners dan setState analogi sifatida foydalanadi, lekin bir nechta widget obuna bo'lish imkoniyati bilan. Bloc Streams dan foydalanadi — holat StreamController ga hodisalar qo'shish orqali o'zgartiriladi. Riverpod yondashuvlarni birlashtiradi, StatefulWidget ga bog'lanmagan holda ham lokal (StateProvider), ham asinxron (AsyncNotifier) boshqaruvni taklif qiladi. Har uch yondashuv setState ni qo'lda chaqirish zaruratini yo'q qiladi — UI yangilanishi ma'lumot o'zgarganda avtomatik ravishda sodir bo'ladi.

Flutter Community Survey 2025 ma'lumotlariga ko'ra (Flutter Foundation, dekabr 2025), dasturchilarning 74% setState dan tashqari kamida bitta holat boshqaruv vositasidan foydalanadi. Shu bilan birga, 92% matn maydoni, chekbox yoki oddiy hisoblagichning lokal ma'lumotlari uchun setState dan foydalanishni davom ettiradi — bu eng yaxshi amaliyot (best practice) hisoblanadi.

Qachon setState ni saqlash kerak

  • Holat faqat bitta widget tomonidan ishlatiladi
  • Oddiy boolean yoki sonli qiymat (fokus, ko'rinish, hisoblagich)
  • Prototiplash va tezkor tajribalar
  • Kontrollerlar (TextEditingController, PageController) baribir StatefulWidget talab qiladi

Oddiy xatolar

Birinchi va eng xavfli xato — disposedan keyin setState chaqirish. Asinxron operatsiya initStateda boshlandi, foydalanuvchi ekranni tark etdi, widget olib tashlandi va asinxron operatsiyaning callbacki setState chaqiradi — ilova istisno bilan ishdan chiqadi. Yechim — chaqirishdan oldin har doim mountedni tekshiring.

Ikkinchi xato — build ichida setState chaqirish. Bu cheksiz siklga olib keladi: build → setState → dirty → build → setState → ... Flutter bunday chaqiruvni bloklamaydi (StackOverflowError olasiz). setState faqat hodisaga javoban chaqirilishi mumkin (tugmani bosish, Future tugashi, oqimdan ma'lumot olish).

Uchinchi xato — setState chaqirmasdan State maydonlarini o'zgartirish. Dasturchi _count++ yozadi va UI yangilanadi deb kutadi. Flutter maydon o'zgarishlarini avtomatik kuzata olmaydi — unga setState orqali aniq signal kerak. Bu Vue.js kabi reaktiv frameworklardan fundamental farqdir, unda ma'lumot o'zgarishi avtomatik yangilanishni ishga tushiradi.

To'rtinchi xato — asinxron callback (async-lambda) bilan setState chaqirish. Asinxronlik bo'limida tasvirlanganidek, awaitdan keyingi o'zgarishlar qamrab olinmaydi, bu esa takrorlash qiyin bo'lgan xatolarga olib keladi. Sinxron callbackdan foydalaning va setState ni awaitdan keyin chaqiring.

Xavfsiz setState uchun eslatma

  • Asinxron callbacklarda har doim mounted ni tekshiring
  • Build ichida setState chaqirmang
  • setState ga async-lambda uzatmang
  • State maydonlarini setState tashqarisida o'zgartirmang
  • Agar bir nechta maydonni o'zgartirsangiz — buni bitta setStateda bajaring

Tez-tez so'raladigan savollar

setState() Flutterda nima qiladi?

setState() Flutterga StatefulWidgetning ichki ma'lumotlari o'zgargani va UI qayta qurilishi kerakligi haqida xabar beradi. Metod callback qabul qiladi, uni sinxron bajaradi, widgetni dirty deb belgilaydi va keyingi kadrda build chaqiruvini rejalashtiradi.

Maydonni o'zgartirgandan keyin setState chaqirmasam nima bo'ladi?

UI yangilanmaydi. Flutter maydon o'zgarishlarini avtomatik kuzatmaydi. Maydon qiymati xotirada o'zgaradi, lekin widget ota tomonidan navbatdagi majburiy qayta qurishgacha avvalgi holatda qoladi.

setState ni build ichida chaqirish mumkinmi?

Mumkin emas. Bu cheksiz siklga olib keladi: build setState chaqiradi, u widgetni dirty deb belgilaydi va yana build chaqiradi. Flutter bunday vaziyatni bloklamaydi — ilova StackOverflowError bilan ishdan chiqadi.

Ketma-ket ikkita setState da build necha marta bajariladi?

Build bir marta bajariladi. Flutter barcha dirty-elementlarni yig'adi va ularni kadr oxirida to'plamli qayta quradi. Birinchisini qayta ishlashdan oldin ikkinchi setState shunchaki elementni o'sha dirty-elementlar ro'yxatiga qo'shadi — takroriy build bo'lmaydi.

mounted nima va u setState uchun nima uchun muhim?

mounted — widget hali daraxtda ekanligini ko'rsatuvchi boolean bayroq. Agar asinxron operatsiyadan keyin mountedni tekshirmasdan setState chaqirsangiz va widget allaqachon olib tashlangan bo'lsa — ilova „setState called after dispose” istisnosi bilan ishdan chiqadi.

Xulosa

  • setState() — Flutterga ma'lumot o'zgarishi haqida xabar beruvchi va keyingi kadrda UI qayta qurilishini boshlovchi State metodi
  • Ishlash mexanizmi — callbackning sinxron bajarilishi, State ni dirty deb belgilash, kadr oxirida barcha dirty-elementlarni to'plamli qayta qurish
  • Asinxronlik — setStateda async-callbacklar ishlamaydi; await tashqarida bo'lishi, setState esa natija olingandan keyin chaqirilishi kerak
  • mounted — istisnoni oldini olish uchun asinxron operatsiyalarda setState dan oldin majburiy tekshiruv
  • Optimallashtirish — const bolaviy widgetlar orqali qayta qurish maydonini minimallashtiring va animatsiyalarni AnimatedBuilder ga o'tkazing
  • Alternativlar — global holat uchun Riverpod, Bloc yoki Provider dan foydalaning; setState ni lokal ma'lumotlar uchun saqlang
  • Qoida — build ichida setState chaqirmang, async-lambda uzatmang, har doim mounted ni tekshiring

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