أولًا: الفرق بين Global Cubit و Local Cubit

🧩 أولًا: الفرق بين Global Cubit و Local Cubit

🟢 1. Global Cubit

🎯 التعريف:

Cubit يتم إنشاؤه في مستوى عالي (عادة main.dart) ويكون متاح في كل التطبيق


🔧 مثال:

MultiBlocProvider(
providers: [
BlocProvider(create: (_) => CounterCubit()),
],
child: MyApp(),
)

🧠 متى نستخدمه؟

عندما تكون البيانات مشتركة بين عدة صفحات

✅ أمثلة:

  • تسجيل الدخول (User)
  • الثيم (Dark/Light)
  • اللغة
  • الكارت (Cart)

⚠️ مميزاته وعيوبه

✔️ مميزات:

  • متاح في كل مكان
  • لا تحتاج إعادة إنشائه

❌ عيوب:

  • يبقى في الذاكرة طول التطبيق
  • ممكن يسبب تعقيد إذا كثر


🔵 2. Local Cubit

🎯 التعريف:

Cubit يتم إنشاؤه داخل صفحة معينة فقط


🔧 مثال:

Navigator.push(
context,
MaterialPageRoute(
builder: (_) => BlocProvider(
create: (_) => ProductCubit(),
child: ProductPage(),
),
),
);

🧠 متى نستخدمه؟

عندما تكون البيانات خاصة بصفحة واحدة فقط

✅ أمثلة:

  • صفحة منتجات
  • صفحة تفاصيل
  • فورم تسجيل

⚠️ مميزاته وعيوبه

✔️ مميزات:

  • يتم حذفه تلقائيًا عند الخروج من الصفحة
  • أخف على الذاكرة

❌ عيوب:

  • لا يمكن استخدامه خارج الصفحة


⚖️ مقارنة سريعة

النوعالاستخدامالعمر
Globalبيانات مشتركةطول التطبيق
Localبيانات صفحةمؤقت

🧠 قاعدة ذهبية

إذا أكثر من صفحة تحتاج نفس البيانات → Global
إذا صفحة واحدة فقط → Local


🧩 ثانيًا: متى تنشئ Cubit لكل صفحة؟

🎯 القاعدة:

👉 كل “Feature” أو “Screen” لها Cubit خاص


🔧 مثال مشروع

عندك:

features/
├── counter/
├── post/
├── product/

✨ الأفضل:

الصفحةCubit
CounterPageCounterCubit
PostPagePostCubit
ProductPageProductCubit

🧠 لماذا؟

✔ فصل المسؤوليات
✔ كود أنظف
✔ سهل التعديل
✔ قابل للتوسعة


❌ خطأ شائع

👉 استخدام Cubit واحد لكل شيء:

AppCubit

❌ هذا يؤدي إلى:

  • كود معقد جدًا
  • صعب الصيانة

🧩 ثالثًا: كيف تدير مشروع كبير باستخدام BLoC Architecture

🔥 هذا أهم جزء


📁 الهيكلة الصحيحة (Clean Architecture)

lib/
├── core/
├── features/
│ ├── counter/
│ │ ├── cubit/
│ │ ├── view/
│ │ └── model/
│ │
│ ├── post/
│ ├── product/

├── main.dart

🧩 داخل كل Feature

counter/
├── cubit/
│ ├── counter_cubit.dart
│ └── counter_state.dart

├── view/
│ └── counter_page.dart

🎯 الفكرة

👉 كل Feature مستقل تمامًا


🔄 تدفق البيانات (Flow)

UI → Cubit → emit → State → UI

🧠 أفضل الممارسات (Very Important)

✅ 1. لا تضع منطق في UI

❌ خطأ:

onPressed: () {
counter++;
}

✔ صح:

context.read<CounterCubit>().increment();

✅ 2. كل Cubit مسؤول عن شيء واحد


✅ 3. استخدم أسماء واضحة

LoginCubit
CartCubit
ThemeCubit

✅ 4. استخدم MultiBlocProvider


✅ 5. لا تخلط بين Features

❌ خطأ:

CounterCubit فيه API و Products

🔥 مثال واقعي (Mini App)

🎯 عندك تطبيق متجر

Global:

  • AuthCubit
  • ThemeCubit

Local:

  • ProductCubit (صفحة المنتجات)
  • CartCubit (صفحة السلة)

💡 متى تستخدم Global + Local معًا؟

✔ طبيعي جدًا

Global → Auth, Theme
Local → Products, Details

🧠 مستوى احترافي (مهم جدًا)

❗ لا تجعل كل شيء Global

👉 هذا خطأ شائع جدًا


❗ لا تنشئ Cubit داخل build

❌ خطأ:

build() {
return BlocProvider(
create: (_) => CounterCubit(),
);
}

👉 سيتم إعادة إنشائه كل rebuild


💥 الخلاصة النهائية

🧩 BlocProvider

  • ينشئ ويوفر Cubit

🧩 BlocBuilder

  • يعرض ويستمع

🧩 emit

  • يرسل الحالة

🧩 Global vs Local

  • حسب نطاق الاستخدام

🧩 MultiBlocProvider

  • لإدارة عدة Cubits