BLoC (Business Logic Component) — Google tomonidan 2018-yilda DartConf-da taqdim etilgan Flutter uchun holatni boshqarish namunasi. BLoC biznes mantiqni va foydalanuvchi interfeysini reaktiv oqimlar (Stream) orqali ajratadi: UI Event yuboradi, BLoC uni qayta ishlaydi va Stream orqali yangi State qaytaradi. pub.dev ma'lumotlariga ko'ra, flutter_bloc paketi 11 mingdan ortiq like to'plagan va minglab Flutter ilovalarida qo'llaniladi.
Asosiy fikrlar
BLoC (Business Logic Component) — Flutter uchun arxitektura namunasi bo'lib, unda biznes mantiq UI dan ajratilgan alohida sinfga chiqariladi. BLoC kirish ma'lumotlarini voqealar oqimi (Event) orqali qabul qiladi va chiqish ma'lumotlarini holat oqimi (State) orqali chiqaradi. Taqdimot qatlami (Widget) faqat State oqimiga obuna bo'ladi va UI ni ko'rsatadi, hech qachon biznes mantiqni to'g'ridan-to'g'ri bajarmaydi.
BLoC kontseptsiyasi reaktiv dasturlash va Observer namunasiga asoslanadi. Har bir BLoC komponenti aniq kontraktga ega alohida moduldir: Event to'plami (nima bo'lishi mumkin) va State to'plami (nima ko'rsatilishi mumkin) ma'lum. Dasturchi UI dan "tasodifan" holatni o'zgartira olmaydi — faqat aniq Event orqali. Bu kodni bashorat qilinadigan va test qilinadigan qiladi.
Flutter Community 2025 so'roviga ko'ra, BLoC Provider-dan keyin Flutter-da holatni boshqarish yechimlari orasida mashhurlik bo'yicha ikkinchi o'rinda. Asosiy afzalliklar: qattiq tipizatsiya, mantiq izolyatsiyasi, o'rnatilgan Stream qo'llab-quvvatlashi, boy vositalar ekotizimi (BlocProvider, BlocListener, BlocSelector).
BLoC arxitekturasi uchta mavjudot atrofida quriladi: Event (kirish), Bloc (qayta ishlovchi) va State (chiqish). Widget add() metodi orqali Event yuboradi. Bloc Event ni mapEventToState yoki on<Event> metodida qabul qiladi, biznes mantiqni bajaradi va yield orqali yangi State chiqaradi. Widget State ni Stream orqali qabul qiladi va qayta chizadi.
abstract class CounterEvent {}
class Increment extends CounterEvent {}
class Decrement extends CounterEvent {}
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0);
@override
Stream<int> mapEventToState(CounterEvent event) async* {
if (event is Increment) {
yield state + 1;
} else if (event is Decrement) {
yield state - 1;
}
}
}Tip xavfsizligi: Bloc ikki tip bilan parametrlangan — Event va State. Dart kompilyatori Widget faqat e'lon qilingan Event larni chaqirishini va Bloc faqat e'lon qilingan State larni qaytarishini tekshiradi. "Noma'lum Harakat" tipidagi ishlash vaqti xatolari istisno qilingan.
Close va Dispose: Bloc Closeable interfeysini amalga oshiradi. Vidjet yo'q qilinganda, Bloc avtomatik ravishda close() metodi orqali Stream ni yopadi. Reaktiv obunalarning oqishi mumkin emas — BlocProvider Blocning hayot aylanishini boshqaradi, uni rout yoki sahifa bilan bog'laydi.
Cubit — flutter_bloc 6.0 paketida taqdim etilgan Eventsiz Blocning soddalashtirilgan amalga oshirilishi. Cubit Event sinflari o'rniga to'g'ridan-to'g'ri metodlarni e'lon qiladi: increment(), fetchData(). Ichki ravishda Cubit xuddi shu Stream asosidagi mexanizmdan foydalanadi, lekin Event qatlamini yashiradi. Bu oddiy stsenariylar uchun boilerplate ni 40-50% ga kamaytiradi.
| Xususiyat | Bloc | Cubit |
|---|---|---|
| Event sinflari | Majburiy | Kerak emas |
| Boilerplate | Yuqori | Past |
| Harakatlarni kuzatish | Event tipi orqali | Faqat metod nomi |
| Mos keladi | Murakkab stsenariylar | Oddiy holatlar |
| Analitika | Event bo'yicha avtomatik | Qo'lda |
Qachon Cubit tanlash: 2-3 variantli holat (loading, loaded, error), oddiy formalar, hisoblagichlar, UI holatlari (ochiq/yopiq). Qachon Bloc: ko'p harakatli murakkab biznes mantiq: buyurtma berish, autentifikatsiya, ma'lumot sinxronizatsiyasi. Bloc har bir harakatni Event orqali batafsil kuzatishni ta'minlaydi — har bir chaqiruv BlocObserver da qayd etiladi.
BlocObserver — ilovadagi barcha Bloc va Cubitlarni kuzatuvchi global kuzatuvchi. Event, State, xato va o'tishlarni qayd etish imkonini beradi. Bitta namunani ulash kifoya: Bloc.observer = AppBlocObserver(), va ilova holatining butun kuzatuvi markazlashtirilgan holda mavjud.
BlocProvider — flutter_bloc dan InheritedWidget, Blocni farzand vidjetlarga taqdim etadi. Vidjetni ishga tushirishda BlocProvider Bloc yaratadi va yo'q qilinganda close() orqali avtomatik yopadi. BlocProvider MaterialApp darajasida (global Bloc) yoki aniq rout darajasida (lokal Bloc) joylashtirilishi mumkin.
BlocProvider(
create: (context) => CounterBloc(),
child: Column(
children: [
BlocBuilder<CounterBloc, int>(
builder: (context, state) => Text('$state'),
),
ElevatedButton(
onPressed: () => context.read<CounterBloc>().add(Increment()),
child: Text('+'),
),
],
),
)BlocBuilder — har bir yangi State da UI ni qayta quradigan vidjet. BlocListener — yon ta'sirlar uchun (UI ni qayta qurmasdan State ni bir marta qayta ishlash): SnackBar ko'rsatish, boshqa ekranga navigatsiya. BlocConsumer — qayta qurish va yon ta'sir kerak bo'lgan hollarda Builder va Listener kombinatsiyasi. BlocSelector — faqat State ning ma'lum maydoni o'zgarganda tanlab qayta qurish uchun.
MultiBlocProvider — ichma-ich BlocProvider lar uchun vidjet, ichki joylashish darajasini oshirmasdan. 10-15 Bloc li Flutter ilovasi barcha ilova bo'ylab mavjud Bloc larni ro'yxatdan o'tkazish uchun ildiz darajasida MultiBlocProvider ishlatadi: AuthenticationBloc, CartBloc, SettingsBloc.
BLoC test qilinadi Flutter vidjetlarisiz izolyatsiyalangan holda. Dart paketi flutter_test va bloc_test paketini import qilish kifoya. Test stsenariysi: Bloc yaratish, Event qo'shish, State ni tekshirish. blocTest — ketma-ketlikni avtomatlashtiruvchi vosita: build → act → expect.
blocTest<CounterBloc, int>(
'emits [1] when Increment is added',
build: () => CounterBloc(),
act: (bloc) => bloc.add(Increment()),
expect: () => [1],
)Mocking: Repozitoriy yoki API ga bog'liq BLoC mocktail orqali mock lar bilan test qilinadi. Repozitoriy abstraksiya darajasida mock qilinadi, Bloc mock qilingan bog'liqliklarni konstruktor orqali oladi. Hydrated Bloc — mahalliy xotirada holatni avtomatik saqlash/tiklash uchun kengaytma. HydratedBlocStorage va vaqtinchalik fayl xotirasi bilan test qilinadi.
Papkalar va fayllar: BLoC bilan Flutter loyihasining odatiy tuzilishi: bloc/counter_bloc.dart, bloc/counter_event.dart, bloc/counter_state.dart. 30+ ekran uchun funksiyalar bo'yicha guruhlash tavsiya etiladi: features/auth/bloc/, features/cart/bloc/. Har bir Bloc alohida fayl, har bir Event va State — yoki alohida fayllarda, yoki Bloc bilan bitta faylda.
Samaradorlik: BLoC bo'sh Stream lar uchun qo'shimcha yuk yaratmaydi. BlocBuilder qayta qurishlarni filtrlash uchun buildWhen dan foydalanadi — vidjet faqat ma'lum shart o'zgarganda yangilanadi. Close faol bo'lmagan Bloc larning xotira sarf qilmasligini kafolatlaydi. Flutter DevTools ma'lumotlariga ko'ra, BLoC paket hajmiga 1% dan kam qo'shadi.
Provider dan migratsiya: BLoC bir loyihada Provider bilan oson birga mavjud bo'ladi. Bosqichma-bosqich migratsiya: avval eng murakkab Provider lar Bloc bilan almashtiriladi, keyin qolganlari. BlocProvider Provider daraxti bilan mos keladi: eski vidjetlar Provider, yangilari — BlocProvider, bir ilovada ishlatishi mumkin.
Ko'p beriladigan savollar
BLoC biznes mantiqni izolyatsiyalash va qattiq tipizatsiya uchun Event + Stream dan foydalanadi. Provider — bog'liqliklarni oddiy joylashtirish va ChangeNotifier uchun InheritedWidget ustidagi qatlam. BLoC ko'p holatli murakkab stsenariylar uchun mosroq, Provider — lokal UI holati uchun. BLoC ko'proq boilerplate talab qiladi, lekin Event orqali to'liq kuzatuvchanlikni beradi.
Hydrated Bloc — hydrated_bloc paketidan kengaytma, oxirgi State ni mahalliy xotirada avtomatik saqlaydi (standart Hive). Ilova qayta ishga tushganda, Bloc boshlang'ich holat o'rniga saqlangan holatni tiklaydi. Bu qo'lda saqlash chaqirig'isiz davomiylik masalasini hal qiladi: kirish, savat, sozlamalar seanslar o'rtasida avtomatik saqlanadi.
BLoC dagi xato mapEventToState yoki on<Event> ichida try-catch orqali boshqariladi. Xato bo'lganda, Bloc xato State ini qaytaradi: yield LoadError(error.message). UI da BlocListener yoki BlocConsumer State ni xato turiga tekshiradi va SnackBar yoki dialog ko'rsatadi. BlocObserver global tarzda barcha boshqarilmagan istisnolarni qayd etadi.
BLoC — Flutter-spesifik namunadir, chunki u Dart Stream va Flutter vidjetlaridan foydalanadi. Event → Bloc → State kontseptsiyasi AngularDart va Server-side Dart uchun moslashtirilishi mumkin, lekin asosiy ekotizim (BlocProvider, BlocBuilder, BlocObserver) Flutter ga bog'liq. React Native uchun Redux yoki MobX, SwiftUI uchun Combine + MVVM dan foydalaning.
Cubit — oddiy holatlar uchun (hisoblagich, toggle, 2-3 maydonli forma). Bloc — murakkab mantiq uchun (yangiliklar lentasi, buyurtma berish, autentifikatsiya). Asosiy qoida: analitika yoki disk raskadrovka uchun har bir harakatni (Event) kuzatish kerak bo'lsa — Bloc. Holatni o'zgartiruvchi metodlar yetarli bo'lsa — Cubit. Ikkala namuna bir loyihada birga mavjud bo'ladi.
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.