BLoC — bu nima, Flutter-dagi Business Logic Component

Muallif: IT Sectr Nashr etilgan: 2026-02-19 O'qish vaqti: 7 daq

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

  • Event — harakatni tavsiflovchi kirish signali: tugmani bosish, ma'lumot yuklash
  • State — UI ning chiqish holati: ma'lumot yuklandi, xato, yuklanmoqda
  • Bloc — Event qabul qiluvchi va Stream orqali State qaytaruvchi asosiy sinf
  • Cubit — Eventsiz Blocning soddalashtirilgan versiyasi, funksiyalarni to'g'ridan-to'g'ri chaqiradi
  • BlocProvider — Blocni vidjetlar daraxtiga joylashtirish uchun Flutter vidjeti

BLoC nima?

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: Event → Bloc → State

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.

Dart
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.

Bloc va Cubit: taqqoslash

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.

XususiyatBlocCubit
Event sinflariMajburiyKerak emas
BoilerplateYuqoriPast
Harakatlarni kuzatishEvent tipi orqaliFaqat metod nomi
Mos keladiMurakkab stsenariylarOddiy holatlar
AnalitikaEvent bo'yicha avtomatikQo'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 va BlocBuilder

BlocProviderflutter_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.

Dart
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 qilish

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.

Dart
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.

BLoC ishlab chiqarishda

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 Flutterda Provider dan nima bilan farqlanadi?

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 nima?

Hydrated Blochydrated_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 da xatolarni qanday boshqarish kerak?

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 ni boshqa framework lar bilan ishlatish mumkinmi?

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.

Bloc yoki Cubit: nimani tanlash kerak?

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

  • BLoC — Flutter da Event → Stream → State orqali holatni boshqarish namunasi
  • Event — harakat (bosish, yuklash), State — reaksiya (ma'lumot, xato, yuklanmoqda)
  • Cubit — Eventsiz soddalashtirilgan versiya, 50% gacha kam boilerplate
  • BlocProvider — avtomatik close bilan Blocni vidjetlar daraxtiga joylashtirish
  • BlocObserver — ilovadagi barcha Bloc va Cubitlarning global monitoringi
  • Hydrated Bloc — Hive orqali holatning avtomatik saqlanib qolishi
  • blocTest — Flutter dan izolyatsiyalangan Bloc modul testi uchun vosita

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