Widget — Flutter frameworkining markaziy tushunchasi bo“ lib, foydalanuvchi interfeysi elementining konfiguratsiyasini tavsiflaydi. Har bir vizual komponent, tugmadan murakkab animatsiyagacha, Widget hisoblanadi. Boshqa frameworklardan farqli o“ laroq, UI alohida XML fayllari orqali tavsiflanadi yoki imperativ ravishda chiziladi, Flutter interfeysni Widget kompozitsiyasi — kichik bo“ linmas elementlarni ierarxik daraxtda birlashtirish orqali quradi. Flutter Documentation (2025) ma“ lumotlariga ko“ ra, Flutter SDK kutubxonasi Material Design, Cupertino va maxsus uslublarni qamrab olgan 260 dan ortiq o“ rnatilgan Widgetni o“ z ichiga oladi.
Asosiy fikrlar
Widget Flutter-da foydalanuvchi interfeysi qismining o“ zgarmas (immutable) tavsifidir. Har bir Widget konfiguratsiya xususiyatlarini o“ z ichiga oladi: o“ lcham, rang, joylashuv, matn, hodisa boshqaruvchilari va bolali Widgetlar. Widgetlarning o“ zi bevosita render qilinmaydi — ular Flutter Engine RenderObject — ekranda haqiqiy grafik obyekt yaratadigan retseptlardir (blueprints).
Flutter falsafasi aytadi: “Everything is a Widget”. Bu shuni anglatadiki, nafaqat ko“ rinadigan elementlar (Text, Image, Button), balki tarkibiy bloklar (Padding, Center, Column, Stack), xatti-harakat bloklari (GestureDetector, AnimatedBuilder) va hatto ilovaning o“ zi (MaterialApp, CupertinoApp) ham Widget hisoblanadi. Bunday yondashuv bir xillikni ta“ minlaydi: ekranning istalgan elementini oddiy joylashtirish orqali boshqa har qanday element bilan birlashtirish mumkin.
Google I/O 2024 — Flutter Widgets Deep Dive ma“ lumotlariga ko“ ra, Flutter-dagi o“ rtacha ilova bir vaqtning o“ zida 200 dan 1500 gacha Widgetni o“ z ichiga oladi. Bu raqamga qaramay, Flutter C++ Skia/Impeller engine darajasidagi optimallashtirishlar tufayli hatto arzon qurilmalarda ham 60 FPS ni saqlaydi. Widgetlar engil obyektlardir (har biri 40–80 bayt), shuning uchun ularni yaratish ishlash tor bo“ yni emas.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(
body: Center(
child: Text('Salom, Flutter!'),
),
),
);
}
}
Widget qanday ishlashini tushunish uchun uchta o“ zaro bog“ liq daraxtdan iborat Flutter arxitekturasini bilish kerak. Birinchisi — Widget tree — UI konfiguratsiyasini tavsiflaydi. Bu engil daraxt bo“ lib, har bir kadrda to“ liq qayta qurilishi mumkin (garbage collector eski Widgetlarni olib tashlaydi va yangilarini yaratadi). Widgetlar o“ zgarmasdir (immutable): agar matn rangi o“ zgargan bo“ lsa — yangi rang bilan yangi Text Widget yaratiladi, eskisi tashlanadi.
Ikkinchi daraxt — Element tree — Widget va RenderObject o“ rtasidagi bog“ lovchi halqadir. Element Widget (konfiguratsiya) va RenderObject (render) ga havolani o“ z ichiga oladi. Widget o“ zgarganda, Flutter yangi Widgetni eski Element bilan solishtiradi va qaror qiladi: mavjud RenderObjectni yangilash (agar Widget bir xil turda bo“ lsa) yoki yangisini yaratish (agar Widget turi o“ zgargan bo“ lsa). Bu jarayon Reconciliation deb ataladi va React Virtual DOM ning analogidir.
Uchinchi daraxt — RenderObject tree — ekranda haqiqiy render uchun javobgardir. RenderObject aniq o“ lchamlar, joylashuvlar va paint metodlarini o“ z ichiga oladi. Flutter Engine (C++ Skia yoki Impeller) RenderObject tree bo“ ylab harakatlanadi va har bir tugunni render qiladi. RenderObject tree eng og“ ir daraxtdir, shuning uchun Flutter bir xil turdagi Widget o“ zgartirilganda RenderObjectni qayta ishlatib, uning o“ zgarishlarini minimallashtiradi.
| Daraxt | Maqsad | Immutable? | Hayot aylanishi |
|---|---|---|---|
| Widget | UI konfiguratsiyasi (retsept) | Ha | Har bir buildda qayta yaratiladi |
| Element | Widget ↔ RenderObject bog“ lanishi | Yo“ q | Vidjet daraxtda ekan, mavjud |
| RenderObject | Render va layout | Yo“ q | Og“ ir, iloji bo“ lsa qayta ishlatiladi |
Flutter Widgetlarni ikkita asosiy turga ajratadi: StatelessWidget va StatefulWidget. StatelessWidget — o“ zgaruvchan holatga ega bo“ lmagan vidjet. StatelessWidget ning ko“ rinishi uning konstruktori tomonidan to“ liq aniqlanadi va renderdan keyin o“ zgarmaydi. Misollar: Text, Icon, Divider, Padding. StatelessWidget ning barcha xususiyatlari konstruktorda final deb e“ lon qilinadi va faqat o“ qish uchun mavjud.
StatefulWidget — o“ zgaruvchan holatga ega vidjet. U ikki sinfdan iborat: Widgetning o“ zi (StatelessWidget kabi o“ zgarmas konfiguratsiya) va State (o“ zgaruvchan holat). Widgetni State dan ajratish Flutterning asosiy arxitektura qaroridir. Widget har bir buildda qayta yaratiladi, ammo State obyekti vidjetning daraxtdagi butun hayot aylanishi davomida yashaydi, holatini saqlaydi.
setState() chaqirilganda, Flutter State-ni “iflos” deb belgilaydi va keyingi kadrda pastki daraxtni qayta qurish uchun build() metodini chaqiradi. Muhim: setState() Widgetning o“ zini qayta yaratmaydi — u faqat mavjud State-da build() chaqiruvini tetiklaydi. Bu shuni anglatadiki, StatefulWidget bolali elementlarning kalitlari (Key) barqaror bo“ lib qolsa, bolali Widgetlarning holatini yo“ qotmasdan UI ni yangilashi mumkin.
// StatelessWidget — tashqi ko“ rinish hech qachon o“ zgarmaydi
class GreetingWidget extends StatelessWidget {
const GreetingWidget({super.key, required this.name});
final String name;
@override
Widget build(BuildContext context) {
return Text('Salom, $name');
}
}
// StatefulWidget — o“ zgaruvchan holatga ega hisoblagich
class CounterWidget extends StatefulWidget {
const CounterWidget({super.key});
@override
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Hisoblagich: $_count'),
ElevatedButton(
onPressed: () => setState(() => _count++),
child: const Text('Oshirish'),
),
],
);
}
}
Flutter-dagi barcha Widgetlarni funktsional maqsadiga ko“ ra uchta asosiy toifaga bo“ lish mumkin. Layout Widget — bolali elementlarning ekranda joylashishi uchun javobgar. Row va Column bolalarni chiziq bo“ ylab joylashtiradi, Stack birini ikkinchisining ustiga qo“ yadi, Expanded va Flexible mavjud joyni taqsimlaydi. Layout Widgetlarning o“ z vizual tasviri yo“ q — ular bolali vidjetlarning joylashuvi va o“ lchamini boshqaradi.
Painting Widget — vizual dizayn uchun javobgar. Container bezaklarni (rang, gradient, soya, chegara) layout xususiyatlari bilan birlashtiradi. Padding bo“ shliqlar qo“ shadi, DecoratedBox fon chizadi, Transform o“ zgartirishlarni qo“ llaydi (aylantirish, masshtablash). Painting Widget vizual uslubning qurilish bloklari bo“ lib, kerakli ko“ rinishga erishish uchun ko“ pincha layout Widget bilan birgalikda ishlatiladi.
Interactive Widget — foydalanuvchi kiritishini qayta ishlaydi. GestureDetector imo-ishoralarni aniqlaydi (tap, swipe, pinch), InkWell Material ripple effektini qo“ shadi, TextField matn kiritishni qabul qiladi, Slider va Switch standart boshqaruv elementlarini taqdim etadi. Interactive Widget hodisalarni konstruktorga uzatiladigan yoki holat provayderlari orqali boshqariladigan callback funktsiyalari orqali ko“ taradi.
| Toifa | Widget misollari | Maqsad |
|---|---|---|
| Layout | Row, Column, Stack, Expanded, Flexible, Align | Bolali elementlarning joylashuvi va o“ lchami |
| Painting | Container, Padding, DecoratedBox, RotatedBox | Rang, fon, chegaralar, soyalar, o“ zgartirishlar |
| Interactive | GestureDetector, InkWell, TextField, Slider | Tegish, kiritish, imo-ishoralarni qayta ishlash |
| Platform | MaterialApp, CupertinoApp, Theme, MediaQuery | Platforma bilan integratsiya, mavzular, moslashish |
| Async | FutureBuilder, StreamBuilder, ValueListenableBuilder | Asinxron ma“ lumotlardan reaktiv yangilash |
Flutter Widget of the Week (Google, 2025) ma“ lumotlariga ko“ ra, Flutter jamoasi deyarli har qanday interfeysni qurish uchun layout + painting + interactive Widget kombinatsiyasidan faol foydalanadi. Masalan, tugma: InkWell (interactive) + Container (painting) + Text (static) + Padding (layout). Bunday modullilik standart bloklarni kodni takrorlamasdan turli kontekstlarda qayta ishlatish imkonini beradi.
Widget kompozitsiyasi — UI ni ba“ zi Widgetlarni boshqalarga joylashtirish orqali qurish jarayoni. Klassik meros olishdan (extends) farqli o“ laroq, bu erda bola sinf ota-onaning xatti-harakatini meros qilib oladi, Flutter agregatsiyadan foydalanadi: har bir Widget boshqa Widgetlarni child (bitta uchun) yoki children (ko“ pchilik uchun) parametri orqali o“ z ichiga oladi. Bu yondashuv ko“ proq moslashuvchanlik va qayta foydalanish imkoniyatini beradi.
BuildContext — Widgetdan keyin ikkinchi eng muhim tushuncha. BuildContext — Widgetning elementlar daraxtidagi joylashuvining deskriptori. BuildContext orqali Widget ajdod vidjetlariga (Theme.of(context), MediaQuery.of(context), Navigator.of(context)) murojaat qilishi mumkin. BuildContext build() metodiga uzatiladi va ota-ona va bola elementlari bilan o“ zaro aloqa qilish uchun ishlatiladi. Har bir Widgetning daraxtdagi joylashuvini noyob tarzda aniqlaydigan bitta BuildContexti bor.
Flutter Architectural Overview (Google, 2025) ga ko“ ra, BuildContext InheritedWidget uchun asosdir — konstruktorlar orqali aniq uzatmasdan ma“ lumotlarni daraxt bo“ ylab pastga uzatish imkonini beruvchi mexanizm. Theme, MediaQuery, Navigator va Provider InheritedWidgetdan foydalanadi. Har bir chuqur joylashtirilgan Widget BuildContext.dependOnInheritedWidgetOfExactType orqali ajdod ma“ lumotlariga kirishi mumkin, bu BuildContextni Flutterning reaktiv arxitekturasining kalitiga aylantiradi.
// Widget kompozitsiyasi joylashtirish orqali
Scaffold(
appBar: AppBar(title: const Text('Mening Ilovam')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Flutter-ga xush kelibsiz',
style: TextStyle(fontSize: 24)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () { /* nav */ },
child: const Text('Boshlash'),
),
],
),
),
)
// BuildContext orqali mavzularga kirish
Text(
'Uslublangan Matn',
style: Theme.of(context).textTheme.headlineMedium,
)
Birinchi va eng keng tarqalgan xato — StatelessWidget yetarli bo“ lgan joyda StatefulWidget ishlatish. Ko“ pgina boshlang“ ich Flutter dasturchilari barcha vidjetlar uchun StatefulWidget yaratadi, hatto holat tashqi provayderda (Provider, Riverpod, BLoC) saqlangan bo“ lsa ham. Bu ortiqcha va ishlashni yomonlashtiradi. Qoida: agar holat tashqaridan boshqarilsa yoki vidjetning o“ z o“ zgaruvchan holati bo“ lmasa, StatelessWidget dan foydalaning.
Ikkinchi xato — build metodi ichida const-konstruktorsiz Widget yaratish. Constsiz yaratilgan har bir Widget har bir buildda qayta ajratiladi. build() ichida Widgetlarni const-konstruktor bilan yaratish orqali Flutter bir xil namunani qayta ishlatishi mumkin, garbage collector yukini kamaytiradi. Iloji boricha hamma joyda const qo“ shing — ayniqsa Text, Icon, SizedBox, Padding va boshqa stateless Widgetlar uchun.
Uchinchi xato — kalitlar (Key) bilan noto“ g“ ri ishlash. Flutter daraxtni qayta qurishda Widgetni aniqlash uchun Key dan foydalanadi. Agar Widget ro“ yxati Keysiz qayta qurilsa, Flutter elementlarning tartibini aralashtirib yuborishi mumkin, bu noto“ g“ ri animatsiyaga yoki holat yo“ qolishiga olib keladi. Ayniqsa dinamik ma“ lumotlar bilan ListView.builder ishlatganda, ro“ yxatlardagi elementlar uchun har doim Key (masalan, ValueKey yoki ObjectKey) qo“ shing.
Tez-tez beriladigan savollar
StatelessWidget — o“ zgaruvchan holatga ega bo“ lmagan vidjet, uning ko“ rinishi to“ liq konstruktor tomonidan aniqlanadi. StatefulWidget — o“ zgaruvchan holatga ega vidjet, holat alohida State obyektida saqlanadi va setState() orqali vidjetning o“ zini qayta yaratmasdan yangilanishi mumkin. Iloji boricha StatelessWidget dan, lokal holat kerak bo“ lganda StatefulWidget dan foydalaning.
Widget immutable — bu Flutterning ishlash uchun arxitektura qaroridir. Agar Widgetlar mutable bo“ lganida, Flutter har bir buildda eski va yangi konfiguratsiyani xavfsiz taqqoslay olmagan bo“ lardi. Immutability Flutterga Widget o“ zgarganmi (== operatori orqali) yoki yo“ qmi tez aniqlashga va mavjud RenderObjectni qayta ishlatib, qimmat render operatsiyalarini minimallashtirishga imkon beradi.
BuildContext — Widgetning elementlar daraxtidagi joylashuvining deskriptori. U orqali Widget ajdod vidjetlariga (Theme, MediaQuery, Navigator) va InheritedWidget ga kirishi mumkin. BuildContext navigatsiya (Navigator.of(context)), SnackBar ko“ rsatish va Provider bilan o“ zaro aloqa qilish uchun ham ishlatiladi. Har bir Widget build() metodi orqali BuildContext oladi va uni merosxo“ rlariga uzatadi.
Elementlarning gorizontal joylashuvi uchun Row, vertikal joylashuvi uchun Column, elementlarni bir-birining ustiga qo“ yish uchun Stack dan foydalaning. Row va Column flexbox prinsipi bilan ishlaydi: children mainAxisSize, mainAxisAlignment va crossAxisAlignment ga muvofiq joy egallaydi. Stack chekkalarga yoki markazga nisbatan aniq joylashtirish uchun positioned-children dan foydalanadi.
Flutter yuqori ishlashga uch mexanizm orqali erishadi: (1) Widget are cheap — engil immutable obyektlar (40–80 bayt), ularni yaratish GC ni yuklamaydi. (2) RenderObject reuse — bir xil turdagi Widget o“ zgartirilganda RenderObject qayta ishlatiladi, qimmat qayta yaratishning oldi olinadi. (3) Skia/Impeller engine — repaint boundaries orqali qo“ ng“ iroqlarni minimallashtirish bilan C++ darajasida render.
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.