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() — 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.
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() 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() ning hisoblagichni oshirish bilan asosiy namunasi. To'g'ri foydalanishni ko'rsatadi: callback ichida maydonni o'zgartirish:
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():
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.
Agar bir nechta maydonni o'zgartirish kerak bo'lsa, barcha o'zgarishlar bir setState ichida amalga oshiriladi. Bu buildning izchil holatni ko'rishini kafolatlaydi:
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.
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:
// 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 operatsiyadan keyin setState() chaqirishdan oldin har doim mountedni tekshiring:
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.
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.
| Stsenariy | Alternativ | Afzallik |
|---|---|---|
| Animatsiya | AnimatedBuilder | Faqat animatsiyalashtirilgan widgetni qayta quradi |
| Ma'lumot oqimi | StreamBuilder | Oqimning har bir elementiga reaksiya beradi |
| Kelajakdagi natija | FutureBuilder | Yuklash/xato holatlarini boshqaradi |
| Lokal qiymat | ValueListenableBuilder | Bitta qiymat o'zgarishiga reaksiya beradi |
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.
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.
mounted ni tekshiringTez-tez so'raladigan savollar
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.
UI yangilanmaydi. Flutter maydon o'zgarishlarini avtomatik kuzatmaydi. Maydon qiymati xotirada o'zgaradi, lekin widget ota tomonidan navbatdagi majburiy qayta qurishgacha avvalgi holatda qoladi.
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.
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 — 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
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.