Flutter Widgets — Google Flutter freymvorkining foydalanuvchi interfeysining asosiy qurilish bloklari bo'lib, barqaror versiyasi 1.0 2018-yil dekabrida chiqarilgan. Flutterda hamma narsa vidjetdir: ekran va tugmadan tortib bo'shliq va tekislashgacha. Vidjetlar Flutter o'zining Skia/Impeller dvigatelida render qiladigan daraxt (widget tree) hosil qiladi, platformaning native komponentlarini chetlab o'tadi. Google I/O (2025) ma'lumotlariga ko'ra, Flutter Google Play va App Store'da 500 000 dan ortiq ilovalarda qo'llaniladi. Flutter arxitekturasi vidjetlarni StatelessWidget (o'zgarmas) va StatefulWidget (State obyekti orqali o'zgaruvchi holat bilan) ga ajratadi.
Asosiy
Flutter Widgets — Flutter freymvorkidagi barcha UI elementlari, o'zgarmas (immutable) Dart sinflari sifatida amalga oshirilgan. Vidjet UI elementining konfiguratsiyasidir: uning o'lchami, rangi, joylashuvi, hodisa boshqaruvchilari. Android (XML + View) yoki iOS (Storyboard + UIView) dan farqli o'laroq, Flutter native komponentlardan foydalanmaydi — hamma narsa Skia (Android/iOS/Linux) yoki Impeller (iOS/macOS) dvigateli tomonidan Canvas da chiziladi. Bu barcha platformalarda platforma farqlarisiz bir xil ko'rinishni ta'minlaydi. Flutter ikki vidjet to'plami bilan keladi: Material Widgets (Android/Web uchun Google Material Design 3 dizayni) va Cupertino Widgets (iOS/macOS uchun Apple HIG dizayni). Dasturchi ikkala to'plamni bitta ilovada birlashtirishi mumkin. Har bir vidjet bolalik vidjet yoki ularning kompozitsiyasini qaytaruvchi build() metodiga ega — vidjet daraxti shunday quriladi.
Flutter uch daraxt bilan ishlaydi: Widget Tree (dasturchi tomonidan yaratilgan konfiguratsiya), Element Tree (vidjetning daraxtdagi o'rniga moslashtirish, freymvork tomonidan boshqariladi), Render Tree (layoutni hisoblaydigan va paintni bajaradigan obyektlar). Widget Element yaratadi, Element RenderObject yaratadi. Element konfiguratsiya o'zgarganda (rebuild) qayta ishlatiladi — bu Flutter optimallashtirish mexanizmi: agar vidjet turi va key mos kelsa, Element qayta yaratilmaydi, faqat yangi konfiguratsiya yangilanadi. Uch daraxtni tushunish Flutter ilovalari samaradorligini optimallashtirish kalitidir.
StatelessWidget — ichki holatni saqlamaydigan vidjet. Parametrlarni konstruktor orqali qabul qiladi va ularni qurilganidan keyin o'zgartirish imkoniyatisiz ko'rsatadi. StatelessWidget statik elementlar uchun idealdir: sarlavhalar, belgilar, avatarlar, o'zgarmas ma'lumotli ro'yxatlar. build() metodi yaratilganda va ota vidjet o'zgarganda bir marta chaqiriladi. StatelessWidget holatga ega bo'lmagani uchun alohida State obyektini talab qilmaydi — build() to'g'ridan-to'g'ri vidjet sinfida belgilanadi.
import 'package:flutter/material.dart';
class ProfileHeader extends StatelessWidget {
final String name;
final String avatarUrl;
const ProfileHeader({super.key, required this.name, required this.avatarUrl});
@override
Widget build(BuildContext context) {
return Row(
children: [
CircleAvatar(
radius: 24,
backgroundImage: NetworkImage(avatarUrl),
),
const SizedBox(width: 12),
Text(
name,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
],
);
}
}ProfileHeader — name va avatarUrl ni konstruktor orqali qabul qiluvchi StatelessWidget. CircleAvatar avatarni, Text esa ismni ko'rsatadi. Vidjet bu qiymatlarni yaratilganidan keyin o'zgartira olmaydi. const konstruktoridan (const ProfileHeader) foydalanish Flutterga ota vidjet rebuildida vidjet nusxasini qayta ishlatishga imkon beradi — bu barcha StatelessWidgetlar uchun tavsiya etilgan mikrooptimallashtirishdir.
StatefulWidget — alohida State obyektida saqlanadigan o'zgaruvchan holatga ega vidjet. StatefulWidgetning o'zi StatelessWidget kabi o'zgarmasdir (immutable). O'zgaruvchan qism State-da jamlangan: State — bir marta yaratilgan va vidjetning ko'p sonli rebuildlaridan omon qoladigan obyekt. Holat o'zgarganda (setState()), Flutter State ning build() metodini chaqiradi va UI ni yangilaydi. StatefulWidget interaktiv elementlar uchun ishlatiladi: hisoblagichlar, matn maydonlari, katakchalar, animatsiyalar, taymerlar.
import 'package:flutter/material.dart';
class LikeButton extends StatefulWidget {
const LikeButton({super.key});
@override
State<LikeButton> createState() => _LikeButtonState();
}
class _LikeButtonState extends State<LikeButton> {
bool liked = false;
int count = 42;
void _toggleLike() {
setState(() {
liked = !liked;
count += liked ? 1 : -1;
});
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: _toggleLike,
child: Text(liked ? '♥ $count' : '♡ $count'),
);
}
}LikeButton — _LikeButtonState State sinfi bilan StatefulWidget. liked va count maydonlari State da saqlanadigan va rebuildda tiklanmaydigan holatdir. setState() Flutterga UI ni qayta qurish zarurligi haqida xabar beradi. Flutter State ni har bir ota rebuildida qayta yaratmaydi — faqat konfiguratsiya o'zgarganda (key yoki vidjet turi). IT Sectr da biz ko'rsatish uchun StatelessWidget va interaktiv komponentlar uchun StatefulWidget dan foydalanamiz, StatefulWidgetni mutatsiya chegaralarigacha minimallashtirish prinsipiga amal qilamiz.
Widget Tree — ilova UI sini tavsiflovchi vidjetlarning iyerarxik tuzilishi. Flutter Widget Tree ni Element Tree ga aylantiradi: har bir Widget daraxtdagi o'rni va RenderObject bilan bog'lanishni kuzatuvchi Element yaratadi. Render Tree layout (o'lcham va joylashuvni aniqlash) va paint (chizish) ni bajaradi. Element asosiy optimallashtirish qatlamidir: agar vidjet turi va key rebuildda o'zgarmagan bo'lsa, Element qayta ishlatiladi, konfiguratsiyani RenderObject ni qayta yaratmasdan yangilaydi. Bu Flutterga yuqori kadr chastotasida (60/120 FPS) samaradorlikni ta'minlaydi.
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Flutter Widgets')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.flutter_dash, size: 80),
const SizedBox(height: 16),
const Text(
'Salom, Flutter!',
style: TextStyle(fontSize: 24),
),
],
),
),
);
}
}HomeScreen vidjet daraxti: Scaffold → AppBar + Center → Column → [Icon, SizedBox, Text]. Scaffold — Material Design ning asosiy layout vidjeti. Center bola Column ni markazlashtiradi. Column bolalarni vertikal ravishda markazga tekislaydi (mainAxisAlignment.center). Flutter layoutni yuqoridan pastga (constraints otadan uzatiladi), o'lchamlarni esa pastdan yuqoriga (sizedByParent yoki sizing from children) hisoblaydi.
BuildContext — vidjetning Element Tree dagi o'rnining deskriptori. Har bir build() metodi BuildContext qabul qiladi, u orqali vidjet quyidagilarga kirish olishi mumkin:MediaQuery (ekran o'lchami, orientatsiyasi, piksel zichligi, xavfsiz hudud), Theme (MaterialThemeData yoki CupertinoThemeData), Navigator (navigatsiya steki), ScaffoldMessenger (SnackBar), InheritedWidget (ma'lumotlarni daraxt bo'ylab uzatish). BuildContext build() tugagandan keyin saqlanmasligi yoki sinxron kontekstdan tashqarida ishlatilmasligi kerak — bu «Scaffold.of() called with a context that does not contain a Scaffold» xatolariga olib keladi. Context ni saqlash o'rniga ma'lumotlarga kirish uchun Builder vidjetidan yoki InheritedWidget namunasidan foydalaning.
Key — har bir vidjet konstruktorining ixtiyoriy parametri (super.key). Key Flutterga ro'yxatdagi elementlarning tartibi/soni o'zgarganda vidjetni aniqlashga yordam beradi. Keysiz Flutter vidjetlarni turi va o'rni bo'yicha taqqoslaydi; ro'yxatning o'rtasiga elementsiz element qo'shganda Flutter noto'g'ri vidjet uchun Elementni qayta ishlatadi, holat (StatefulWidget) va animatsiya xatolariga sabab bo'ladi. Ro'yxatlar uchun ValueKey (noyob identifikator), ObjectKey (ma'lumot obyekti asosida), UniqueKey
Flutter SDK (barqaror versiya 3.3+, Dart 3+) toifalarga bo'lingan 200+ o'rnatilgan vidjetni o'z ichiga oladi: Layout (Row, Column, Stack, Container, Expanded, Flexible, Wrap, GridView, ListView, CustomScrollView), Material Design (Scaffold, AppBar, Card, Drawer, BottomNavigationBar, FloatingActionButton, TabBar, Chip, DataTable), Cupertino (CupertinoPageScaffold, CupertinoNavigationBar, CupertinoButton, CupertinoTabBar), Painting & Effects (Opacity, DecoratedBox, ClipRect, Transform, BackdropFilter, ShaderMask), Async (FutureBuilder, StreamBuilder) va Accessibility (Semantics, MergeSemantics, ExcludeSemantics). Layout vidjetlari har qanday Flutter UI ning asosidir: Row gorizontal ketma-ketliklar uchun, Column vertikal uchun, Stack bir-birining ustiga tushadigan elementlar uchun, Container BoxDecoration bilan bezash uchun.
| Toifa | Asosiy vidjetlar | Vazifasi |
|---|---|---|
| Layout | Row, Column, Stack, Container, Expanded, Flexible | Bola elementlarning joylashuvi va o'lchamlari |
| Material | Scaffold, AppBar, Card, Drawer, FAB, TabBar | Material Design 3 UI komponentlari |
| Cupertino | CupertinoPageScaffold, CupertinoNavigationBar, CupertinoButton | iOS uslubidagi komponentlar |
| Painting | Opacity, ClipRect, Transform, DecoratedBox, BackdropFilter | Vizual effektlar va kesish |
| Async | FutureBuilder, StreamBuilder | UI holatlari bilan asinxron ma'lumot yuklash |
| Accessibility | Semantics, MergeSemantics | Ekran o'quvchilari uchun semantik belgilash |
Tez-tez beriladigan savollar
StatelessWidget ichki holatga ega emas — barcha ma'lumotlar konstruktor orqali uzatiladi va o'zgarmaydi. StatefulWidget o'zgaruvchan holatni alohida State obyektida saqlaydi, rebuildlardan omon qoladi. Holat o'zgarishi setState() ni chaqiradi va Flutter UI ni qayta quradi. O'zgarmas elementlar uchun StatelessWidget; interaktiv elementlar uchun StatefulWidget dan foydalaning.
BuildContext — vidjetning Element Tree dagi o'rnining deskriptori bo'lib, build() metodiga uzatiladi. Context orqali vidjet MediaQuery, Theme, Navigator, ScaffoldMessenger va InheritedWidget ga kirishadi. BuildContext build() tugagandan keyin saqlanmasligi kerak. Ma'lumotlarga kirish uchun Builder vidjeti yoki InheritedWidget dan foydalaning.
Ha, Flutter Dart dan yagona dasturlash tili sifatida foydalanadi. Dart null-safety, tovush turlari (sound null safety), extension methods va pattern matching bilan statik tipli tildir. Boshlash uchun Dart asoslari yetarli: sinflar, funksiyalar, async/await, to'plamlar. Dart Dart Native orqali native kodda (AOT) va Dart2JS orqali JavaScript da (veb uchun) kompilyatsiya qilinadi.
Yo'q, Flutter olti platformani qo'llab-quvvatlaydi: iOS, Android, Web, macOS, Windows, Linux. Kodning 90% dan ortig'i barcha platformalar uchun umumiydir. Platforma moslashuvlari (kamera, fayl tizimi) plaginlar yoki platform kanallari orqali amalga oshiriladi. Desktop uchun Flutter Flutter Desktop oyna qobig'idan, veb uchun esa CanvasKit (WebGL) dvigateli yoki HTML rendererdan foydalanadi.
Flutter 60/120 FPS ga o'zining 2D dvigateli (Skia/Impeller), native bridge yo'qligi (React Nativedan farqli o'laroq), o'zgarmas tur/key bilan Elementni qayta ishlatish bilan uch daraxt (Widget → Element → Render), bir yo'nalishli o'tishli layout algoritmi (constraints down, sizes up) va ekranning alohida zonalarini qayta chizishni izolyatsiyalash uchun RepaintBoundary orqali erishadi.
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.