BLoC — یہ کیا ہے، Flutter میں Business Logic Component

مصنف: IT Sectr اشاعت: 2026-02-19 مطالعے کا وقت: 7 منٹ

BLoC (Business Logic Component) — Flutter کے لیے ایک اسٹیٹ مینجمنٹ پیٹرن، جسے Google نے 2018 میں DartConf میں پیش کیا۔ BLoC ری ایکٹو سٹریمز (Stream) کے ذریعے کاروباری منطق اور صارف انٹرفیس کو الگ کرتا ہے: UI ایک Event بھیجتا ہے، BLoC اسے پروسیس کرتا ہے اور Stream کے ذریعے ایک نیا State لوٹاتا ہے۔ pub.dev کے مطابق، flutter_bloc پیکیج نے 11 ہزار سے زیادہ لائیکس حاصل کیے ہیں اور ہزاروں Flutter ایپلی کیشنز میں استعمال ہوتا ہے۔

اہم نکات

  • Event — ایک عمل کو بیان کرنے والا ان پٹ سگنل: بٹن دبانا، ڈیٹا لوڈ کرنا
  • State — UI آؤٹ پٹ حالت: ڈیٹا لوڈ ہوا، خرابی، لوڈ ہو رہا ہے
  • Bloc — مرکزی کلاس جو Event وصول کرتی ہے اور Stream کے ذریعے State لوٹاتی ہے
  • Cubit — Event کے بغیر Bloc کا آسان ورژن، براہ راست فنکشن کال کرتا ہے
  • BlocProvider — وجیٹ ٹری میں Bloc انجیکٹ کرنے کے لیے Flutter وجیٹ

BLoC کیا ہے؟

BLoC (Business Logic Component) — Flutter کے لیے ایک آرکیٹیکچرل پیٹرن جس میں کاروباری منطق کو UI سے الگ ایک علیحدہ کلاس میں نکالا جاتا ہے۔ BLoC ایونٹس کی سٹریم (Event) کے ذریعے ان پٹ ڈیٹا وصول کرتا ہے اور اسٹیٹس کی سٹریم (State) کے ذریعے آؤٹ پٹ ڈیٹا پیدا کرتا ہے۔ پریزنٹیشن پرت (Widget) صرف State سٹریم کو سبسکرائب کرتی ہے اور UI پیش کرتی ہے، کبھی براہ راست کاروباری منطق پر عمل نہیں کرتی۔

BLoC تصور ری ایکٹو پروگرامنگ اور Observer پیٹرن پر مبنی ہے۔ ہر BLoC جزو ایک واضح معاہدے کے ساتھ ایک علیحدہ ماڈیول ہے: Event کا ایک معروف سیٹ (کیا ہو سکتا ہے) اور State کا ایک معروف سیٹ (کیا دکھایا جا سکتا ہے)۔ ایک ڈویلپر UI سے "غلطی سے" حالت تبدیل نہیں کر سکتا — صرف ایک مخصوص Event کے ذریعے۔ یہ کوڈ کو پیش قیاسی اور قابل جانچ بناتا ہے۔

Flutter Community 2025 سروے کے مطابق، Provider کے بعد Flutter میں اسٹیٹ مینجمنٹ حلوں میں BLoC دوسرے نمبر پر ہے۔ اہم فوائد: مضبوط ٹائپنگ، منطق کی علیحدگی، بلٹ ان Stream سپورٹ، افادیت کا بھرپور ماحولیاتی نظام (BlocProvider، BlocListener، BlocSelector)۔

BLoC آرکیٹیکچر: Event → Bloc → State

BLoC آرکیٹیکچر تین ہستیوں کے گرد بنایا گیا ہے: Event (ان پٹ)، Bloc (ہینڈلر) اور State (آؤٹ پٹ)۔ Widget add() طریقہ کے ذریعے Event بھیجتا ہے۔ Bloc mapEventToState یا on<Event> طریقہ میں Event وصول کرتا ہے، کاروباری منطق پر عمل کرتا ہے اور yield کے ذریعے ایک نیا State جاری کرتا ہے۔ Widget Stream کے ذریعے State وصول کرتا ہے اور دوبارہ تعمیر کرتا ہے۔

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;
    }
  }
}

قسم کی حفاظت: Bloc دو قسموں — Event اور State — سے پیرامیٹرائز کیا گیا ہے۔ Dart کمپائلر چیک کرتا ہے کہ Widget صرف اعلان کردہ Event کو کال کرتا ہے اور Bloc صرف اعلان کردہ State لوٹاتا ہے۔ "نامعلوم ایکشن" جیسی رن ٹائم خرابیاں ختم ہو جاتی ہیں۔

Close اور Dispose: Bloc Closeable انٹرفیس کو نافذ کرتا ہے۔ جب کوئی وجیٹ تباہ ہوتا ہے، Bloc خود بخود close() طریقہ کے ذریعے Stream بند کر دیتا ہے۔ ری ایکٹو سبسکرپشن لیک ناممکن ہے — BlocProvider Bloc کے لائف سائیکل کا انتظام کرتا ہے، اسے کسی روٹ یا صفحہ سے جوڑتا ہے۔

Bloc اور Cubit: موازنہ

Cubit Event کے بغیر Bloc کا ایک آسان نفاذ ہے، جو flutter_bloc 6.0 پیکیج میں متعارف کرایا گیا۔ Cubit Event کلاسز کے بجائے براہ راست طریقے اعلان کرتا ہے: increment()، fetchData()۔ اندرونی طور پر، Cubit اسی Stream-based میکانزم کا استعمال کرتا ہے لیکن Event پرت کو چھپاتا ہے۔ یہ سادہ منظرناموں کے لیے boilerplate کو 40-50% تک کم کرتا ہے۔

خصوصیتBlocCubit
Event کلاسزلازمیضروری نہیں
Boilerplateزیادہکم
عمل کی ٹریکنگEvent قسم کے ذریعےصرف طریقہ کا نام
کے لیے موزوںپیچیدہ منظرنامےسادہ حالتیں
تجزیہEvent کے ذریعے خودکاردستی

Cubit کب منتخب کریں: 2-3 متغیر والی حالت (loading، loaded، error)، سادہ فارم، کاؤنٹر، UI حالتیں (کھلا/بند)۔ Bloc کب منتخب کریں: متعدد اعمال کے ساتھ پیچیدہ کاروباری منطق: آرڈر پروسیسنگ، اجازت، ڈیٹا سنکرونائزیشن۔ Bloc Event کے ذریعے ہر عمل کی تفصیلی ٹریسنگ فراہم کرتا ہے — ہر کال BlocObserver میں لاگ ہوتی ہے۔

BlocObserver — ایک عالمی مبصر جو ایپلیکیشن میں تمام Bloc اور Cubit کو ٹریک کرتا ہے۔ یہ Event، State، خرابیوں اور منتقلی کو لاگ کرنے کی اجازت دیتا ہے۔ صرف ایک انسٹینس جوڑیں: Bloc.observer = AppBlocObserver()، اور پوری ایپلیکیشن اسٹیٹ ٹریسنگ مرکزی طور پر دستیاب ہے۔

BlocProvider اور BlocBuilder

BlocProviderflutter_bloc سے ایک InheritedWidget جو چائلڈ وجیٹس کو Bloc فراہم کرتا ہے۔ جب کوئی وجیٹ شروع ہوتا ہے، BlocProvider ایک Bloc بناتا ہے، اور جب تباہ ہوتا ہے — close() کے ذریعے خود بخود اسے بند کر دیتا ہے۔ BlocProvider کو MaterialApp سطح (عالمی Bloc) یا کسی مخصوص روٹ سطح (مقامی Bloc) پر رکھا جا سکتا ہے۔

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 — ایک وجیٹ جو ہر نئے State پر UI کو دوبارہ تعمیر کرتا ہے۔ BlocListener — ضمنی اثرات کے لیے (UI کو دوبارہ تعمیر کیے بغیر ایک بار State پروسیس کریں): SnackBar دکھانا، دوسری اسکرین پر جانا۔ BlocConsumer — Builder اور Listener کا مجموعہ ان صورتوں کے لیے جہاں دوبارہ تعمیر اور ضمنی اثر دونوں کی ضرورت ہو۔ BlocSelector — صرف اس وقت منتخب دوبارہ تعمیر کے لیے جب State کا کوئی مخصوص فیلڈ تبدیل ہو۔

MultiBlocProvider — نیسٹنگ لیول بڑھائے بغیر نیسٹڈ BlocProvider کے لیے ایک وجیٹ۔ 10-15 Bloc والی Flutter ایپلیکیشن روٹ لیول پر MultiBlocProvider استعمال کرتی ہے تاکہ تمام Bloc رجسٹر ہو سکیں جو پوری ایپلیکیشن کے لیے دستیاب ہیں: AuthenticationBloc، CartBloc، SettingsBloc۔

BLoC کی جانچ

BLoC کی جانچ Flutter وجیٹس کے بغیر الگ تھلگ کی جاتی ہے۔ صرف Dart پیکیج flutter_test اور bloc_test پیکیج درآمد کریں۔ جانچ کا منظر: Bloc بنائیں، Event شامل کریں، State چیک کریں۔ blocTest — ایک افادیت جو ترتیب کو خودکار کرتی ہے: build → act → expect۔

Dart
blocTest<CounterBloc, int>(
  'emits [1] when Increment is added',
  build: () => CounterBloc(),
  act: (bloc) => bloc.add(Increment()),
  expect: () => [1],
)

موکنگ: ایک Bloc جو ریپوزٹری یا API پر منحصر ہے، mocktail کے ذریعے موک کے ساتھ جانچا جاتا ہے۔ ریپوزٹری کو تجرید کی سطح پر موک کیا جاتا ہے، اور Bloc کنسٹرکٹر کے ذریعے موک کردہ انحصار وصول کرتا ہے۔ Hydrated Bloc — مقامی اسٹوریج میں خودکار اسٹیٹ برقرار رہنے/بحالی کے لیے ایک توسیع۔ اسے HydratedBlocStorage اور عارضی فائل اسٹوریج کے ساتھ جانچا جاتا ہے۔

پروڈکشن میں BLoC

فولڈرز اور فائلیں: BLoC کے ساتھ ایک عام Flutter پروجیکٹ ڈھانچہ: bloc/counter_bloc.dart، bloc/counter_event.dart، bloc/counter_state.dart۔ 30+ اسکرینوں کے لیے، فیچر پر مبنی گروپ بندی تجویز کی جاتی ہے: features/auth/bloc/، features/cart/bloc/۔ ہر Bloc ایک علیحدہ فائل، ہر Event اور State — یا تو علیحدہ فائلوں میں یا Bloc کے ساتھ ایک فائل میں۔

کارکردگی: BLoC خالی Stream کے لیے اوورہیڈ نہیں بناتا۔ BlocBuilder دوبارہ تعمیر کو فلٹر کرنے کے لیے buildWhen استعمال کرتا ہے — وجیٹ صرف اس وقت اپڈیٹ ہوتا ہے جب کوئی مخصوص شرط تبدیل ہو۔ Close یقینی بناتا ہے کہ غیر فعال Bloc میموری استعمال نہ کریں۔ Flutter DevTools کے مطابق، BLoC بنڈل سائز میں 1% سے کم اضافہ کرتا ہے۔

Provider سے منتقلی: BLoC ایک ہی پروجیکٹ میں Provider کے ساتھ آسانی سے موجود رہ سکتا ہے۔ بتدریج منتقلی: پہلے سب سے پیچیدہ Provider کو Bloc سے تبدیل کریں، پھر باقی۔ BlocProvider Provider ٹری کے ساتھ مطابقت رکھتا ہے: پرانے وجیٹس Provider استعمال کر سکتے ہیں، نئے — BlocProvider، ایک ہی ایپلیکیشن کے اندر۔

اکثر پوچھے گئے سوالات

Flutter میں BLoC Provider سے کیسے مختلف ہے؟

BLoC کاروباری منطق کی علیحدگی اور مضبوط ٹائپنگ کے لیے Event + Stream استعمال کرتا ہے۔ Provider سادہ انحصار انجیکشن اور ChangeNotifier کے لیے InheritedWidget کے گرد ایک لپیٹ ہے۔ BLoC متعدد حالتوں والے پیچیدہ منظرناموں کے لیے بہتر ہے، Provider — مقامی UI حالت کے لیے۔ BLoC کو زیادہ boilerplate کی ضرورت ہے لیکن Event کے ذریعے مکمل ٹریس ایبلٹی فراہم کرتا ہے۔

Hydrated Bloc کیا ہے؟

Hydrated Bloc hydrated_bloc پیکیج کی ایک توسیع ہے جو خود بخود آخری State کو مقامی اسٹوریج (بطور ڈیفالٹ Hive) میں محفوظ کرتی ہے۔ جب ایپلیکیشن دوبارہ شروع ہوتی ہے، Bloc ابتدائی حالت کے بجائے محفوظ کردہ حالت بحال کرتا ہے۔ یہ دستی سیو کال کے بغیر برقرار رہنے کے مسئلے کو حل کرتا ہے: لاگ ان، کارٹ، سیٹنگز سیشنز کے درمیان خود بخود محفوظ ہو جاتے ہیں۔

BLoC میں خرابیوں کو کیسے ہینڈل کریں؟

BLoC میں خرابی کو mapEventToState یا on<Event> کے اندر try-catch کے ذریعے ہینڈل کیا جاتا ہے۔ خرابی پر، Bloc ایک خرابی State لوٹاتا ہے: yield LoadError(error.message)۔ UI پر، BlocListener یا BlocConsumer خرابی کی قسم کے لیے State چیک کرتا ہے اور SnackBar یا ڈائیلاگ دکھاتا ہے۔ BlocObserver عالمی طور پر تمام غیر ہینڈلڈ استثنیات کو لاگ کرتا ہے۔

کیا BLoC دوسرے فریم ورکس کے ساتھ استعمال کیا جا سکتا ہے؟

BLoC ایک Flutter-specific پیٹرن ہے کیونکہ یہ Dart Stream اور Flutter وجیٹس استعمال کرتا ہے۔ Event → Bloc → State تصور کو AngularDart اور Server-side Dart کے لیے ڈھالا جا سکتا ہے، لیکن بنیادی ماحولیاتی نظام (BlocProvider، BlocBuilder، BlocObserver) Flutter سے منسلک ہے۔ React Native کے لیے Redux یا MobX استعمال کریں؛ SwiftUI کے لیے Combine + MVVM استعمال کریں۔

کیا منتخب کریں: Bloc یا Cubit؟

Cubit — سادہ حالتوں کے لیے (کاؤنٹر، ٹوگل، 2-3 فیلڈ والا فارم)۔ Bloc — پیچیدہ منطق کے لیے (نیوز فیڈ، آرڈر پروسیسنگ، اجازت)۔ بنیادی اصول: اگر آپ کو تجزیہ یا ڈیبگنگ کے لیے ہر عمل (Event) کی ٹریسنگ کی ضرورت ہے — Bloc منتخب کریں۔ اگر حالت تبدیل کرنے والے طریقے کافی ہیں — Cubit منتخب کریں۔ دونوں پیٹرن ایک ہی پروجیکٹ میں موجود رہ سکتے ہیں۔

خلاصہ

  • BLoC — Event → Stream → State کے ذریعے Flutter اسٹیٹ مینجمنٹ پیٹرن
  • Event — عمل (دبانا، لوڈ کرنا)، State — ردعمل (ڈیٹا، خرابی، لوڈ ہو رہا ہے)
  • Cubit — Event کے بغیر آسان ورژن، 50% تک کم boilerplate
  • BlocProvider — خودکار بندش کے ساتھ وجیٹ ٹری میں Bloc انجیکشن
  • BlocObserver — ایپلیکیشن میں تمام Bloc اور Cubit کی عالمی نگرانی
  • Hydrated Bloc — Hive کے ذریعے خودکار اسٹیٹ برقرار رہنا
  • blocTest — Flutter سے الگ Bloc یونٹ ٹیسٹنگ کے لیے افادیت

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں