🧩 أولًا: الفرق بين 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 |
|---|---|
| CounterPage | CounterCubit |
| PostPage | PostCubit |
| ProductPage | ProductCubit |
🧠 لماذا؟
✔ فصل المسؤوليات
✔ كود أنظف
✔ سهل التعديل
✔ قابل للتوسعة
❌ خطأ شائع
👉 استخدام 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