شرح Bloc كمقدمة

🔵 أولاً: ما هو BLoC؟

BLoC pattern

BLoC = Business Logic Component

هو أسلوب لإدارة الحالة يفصل بين:

  • 🧠 منطق التطبيق (Business Logic)
  • 🎨 واجهة المستخدم (UI)

🧠 الفكرة الأساسية

التطبيق يعمل مثل “نظام رسائل”:

  1. المستخدم يقوم بحدث (Event)
  2. يتم إرسال الحدث إلى BLoC
  3. BLoC يعالج الحدث
  4. يخرج حالة جديدة (State)
  5. الواجهة تتحدث

🔄 مخطط تدفق BLoC

👆 User Action

📩 Event

🧠 BLoC (Processing)

📊 State

🎨 UI Update

🔍 مثال ذهني

تخيل:

  • ضغطت زر “تحميل بيانات”

ما يحدث:

  • Event = طلب تحميل
  • BLoC يبدأ المعالجة (API مثلاً)
  • يخرج:
    • Loading
    • Success أو Error

🎯 مميزات BLoC

✅ 1. فصل كامل بين UI و Logic

الواجهة لا تعرف كيف تعمل البيانات.


✅ 2. مناسب جداً للمشاريع الكبيرة

لأنه:

  • منظم
  • قابل للتوسع

✅ 3. قابل للاختبار (Testable)

تستطيع اختبار المنطق بدون UI.


✅ 4. يعتمد على Streams

يعني:

  • تدفق بيانات مستمر
  • تحديثات لحظية

❌ عيوب BLoC

  • معقد للمبتدئين 😅
  • يحتاج كتابة أكثر (Boilerplate)

🟣 ثانياً: ما هو Cubit؟

Cubit flutter

Cubit هو نسخة مبسطة من BLoC.


🧠 الفكرة الأساسية

بدل:

  • Event ➜ State

يصبح:

  • Function ➜ State

🔄 مخطط Cubit

👆 User Action

⚙️ Function (Cubit)

📊 State

🎨 UI Update

🔍 الفرق الجوهري

BLoCCubit
يستخدم Eventsلا يستخدم Events
أعقدأبسط
مناسب للأنظمة الكبيرة جداًمناسب لمعظم التطبيقات

🎯 مميزات Cubit

✅ 1. سهل التعلم

لا يوجد Events


✅ 2. أقل كود

أبسط في الكتابة


✅ 3. نفس قوة BLoC تقريباً

لكن بدون تعقيد Streams المباشر


✅ 4. مناسب للمشاريع المتوسطة والكبيرة


❌ عيوب Cubit

  • أقل تنظيم من BLoC في المشاريع الضخمة جداً
  • لا يوجد فصل صارم مثل BLoC

🔥 الفرق بشكل بصري

🧱 BLoC (نظام رسمي صارم)

UI → Event → BLoC → State → UI

⚡ Cubit (مباشر وسريع)

UI → Function → State → UI

🧠 متى أستخدم كل واحد؟

استخدم Cubit إذا:

  • تريد سرعة في التطوير
  • المشروع متوسط
  • لا تحتاج تعقيد كبير

استخدم BLoC إذا:

  • مشروع ضخم جداً
  • فيه تدفقات معقدة
  • فريق كبير يعمل عليه

🧩 تشبيه بسيط

🏢 BLoC = شركة كبيرة

  • كل شيء له قسم
  • نظام صارم
  • إجراءات واضحة

🏪 Cubit = متجر صغير

  • مباشر
  • سريع
  • بدون تعقيد

🔥 خلاصة قوية

  • BLoC = قوة + تنظيم + تعقيد
  • Cubit = بساطة + سرعة + مرونة

🚀 نصيحتي لك

ابدأ بـ Cubit 👇
ثم لما تفهمه 100% ➜ انتقل إلى BLoC


إذا تحب الخطوة الجاية 👇
أقدر أرسم لك Flow حقيقي لتطبيق (Login أو API) باستخدام Cubit و BLoC حتى تفهمهم بشكل احترافي 🔥

اي نعم أحب

جميل 🔥 الآن سنأخذ مثال حقيقي وواضح جداً:
👉 تطبيق تسجيل الدخول (Login)
ونشرح كيف يعمل باستخدام Cubit و BLoC كمخطط ذهني احترافي (بدون كود).


🟣 أولاً: تدفق Cubit (Login Flow)

Cubit flutter

🎯 الفكرة العامة

Cubit يعمل بشكل مباشر:
👉 المستخدم ➜ دالة ➜ حالة ➜ واجهة


🔄 المخطط الكامل

👤 User يدخل email + password

🔘 يضغط زر Login

⚙️ Cubit.login()

📊 State: Loading

🌐 API Request

📊 State:
✔ Success → دخول
❌ Error → رسالة خطأ

🎨 UI تتحدث تلقائياً

🧠 شرح ذهني

  1. المستخدم يضغط زر تسجيل الدخول
  2. يتم استدعاء دالة داخل Cubit (مثلاً login)
  3. Cubit يقول:
    • “أنا الآن في حالة Loading”
  4. يرسل طلب للسيرفر
  5. بعد النتيجة:
    • نجاح ➜ Success
    • فشل ➜ Error
  6. الواجهة تتغير حسب الحالة

📊 الحالات (States)

  • 🟡 Initial
  • 🔵 Loading
  • 🟢 Success
  • 🔴 Error

💡 كيف تفكر فيه؟

Cubit =

“أنا أملك الحالة، وأغيرها مباشرة حسب ما يحدث”


🔵 ثانياً: تدفق BLoC (Login Flow)

BLoC pattern

🎯 الفكرة العامة

BLoC يعمل عبر وسيط (Events)


🔄 المخطط الكامل

👤 User يدخل البيانات

🔘 يضغط Login

📩 Event: LoginRequested

🧠 BLoC يستقبل الحدث

📊 State: Loading

🌐 API Request

📊 State:
✔ Success
❌ Error

🎨 UI تتحدث

🧠 شرح ذهني

  1. المستخدم يضغط زر
  2. يتم إرسال Event (طلب تسجيل دخول)
  3. BLoC يستلم الحدث
  4. يقرر ماذا يفعل
  5. يغير الحالة:
    • Loading
    • Success / Error
  6. UI تستجيب

📦 مكونات BLoC

📩 Events

  • LoginRequested
  • LogoutRequested

📊 States

  • Initial
  • Loading
  • Success
  • Error

🧠 BLoC

  • هو العقل الذي يربط بينهم

⚔️ مقارنة حقيقية (Login)

العنصرCubitBLoC
البدايةFunction مباشرةEvent
التعقيدبسيطأعلى
التحكمأقل تنظيماًأكثر تنظيماً
مناسبأغلب التطبيقاتالأنظمة الكبيرة

🔥 الفرق بشكل بصري واضح

Cubit ⚡

Button → login() → State → UI

BLoC 🧱

Button → Event → BLoC → State → UI

🧠 متى تستخدم كل واحد في هذا المثال؟

استخدم Cubit إذا:

  • عندك Login بسيط
  • API واحد
  • لا يوجد سيناريوهات معقدة

استخدم BLoC إذا:

  • Login مع:
    • OTP
    • تحقق متعدد
    • صلاحيات
    • حالات كثيرة

🧩 تخيلها بهذه الطريقة

Cubit:

مثل زر تشغيل مباشر 🔘


BLoC:

مثل نظام طلبات داخل شركة 📩


🚀 خلاصة احترافية

  • Cubit = سرعة + بساطة
  • BLoC = تنظيم + تحكم عالي

🔥 الخطوة القادمة (مهم جداً)

إذا تريد توصل لمستوى قوي 👇
أقدر أرسم لك:

💡 “Architecture كاملة لتطبيق Flutter”

  • UI
  • Cubit/BLoC
  • Repository
  • API

بشكل احترافي مثل الشركات 🔥

نعم ارسم

تمام 🔥 الآن سنرسم لك Architecture احترافية كاملة لتطبيق Flutter
(نفس اللي تُستخدم في الشركات) — بشكل واضح وبسيط.

سنستخدم مفهوم:
👉 Clean Architecture + Cubit/BLoC


🏗️ الشكل العام للتطبيق

🎨 UI (Screens / Widgets)

🧠 Cubit / BLoC

📦 Repository

🌐 API / Local DB

🎨 أول طبقة: UI (واجهة المستخدم)

🧩 ماذا تحتوي؟

  • صفحات (Login, Home…)
  • Widgets
  • Buttons, TextFields

🎯 دورها

  • عرض البيانات فقط
  • إرسال أوامر (Actions)

❗ مهم جداً

الـ UI لا يحتوي منطق


🔄 مثال

User يضغط Login

يرسل الطلب إلى Cubit/BLoC

🧠 الطبقة الثانية: Cubit / BLoC

Cubit flutter
BLoC pattern

🎯 دورها

  • إدارة الحالة (State)
  • تنفيذ المنطق

🔄 ماذا تفعل؟

استقبال الطلب من UI

تشغيل المنطق

طلب بيانات من Repository

إرجاع State جديد

📊 الحالات

  • Loading
  • Success
  • Error

🧠 ملاحظة

هذه الطبقة هي “العقل الحقيقي” للتطبيق


📦 الطبقة الثالثة: Repository

🎯 لماذا موجودة؟

لعمل فصل كامل بين:

  • منطق التطبيق
  • مصدر البيانات

🔄 ماذا تفعل؟

Cubit/BLoC يطلب بيانات

Repository يقرر:
🌐 API ؟
💾 Local DB ؟

يرجع البيانات

💡 الفائدة

  • تغيير API بدون تغيير UI
  • اختبار أسهل

🌐 الطبقة الرابعة: Data Source

🧩 أنواعها

🌍 Remote Data Source

  • API
  • الإنترنت

💾 Local Data Source

  • SQLite
  • Cache

🔄 دورها

تنفيذ الطلب فعلياً:
- HTTP Request
- قراءة من قاعدة بيانات

🔥 التدفق الكامل (Login مثال)

🟣 باستخدام Cubit

👤 User

🎨 UI

⚙️ Cubit.login()

📦 Repository.login()

🌐 API

📦 Repository

📊 Cubit State

🎨 UI Update

🔵 باستخدام BLoC

👤 User

🎨 UI

📩 Event (LoginRequested)

🧠 BLoC

📦 Repository

🌐 API

📦 Repository

📊 State

🎨 UI

⚔️ الفرق داخل الـ Architecture

الطبقةCubitBLoC
طريقة التشغيلFunctionEvent
التعقيدأقلأعلى
التحكممباشرمنظم أكثر

🧠 لماذا هذه المعمارية قوية؟

✅ 1. فصل كامل (Separation of Concerns)

كل طبقة لها دور واحد فقط


✅ 2. سهولة التعديل

تغير API؟
لا تحتاج تعديل UI 😎


✅ 3. اختبار سهل

تستطيع اختبار كل طبقة لوحدها


✅ 4. مناسب للشركات

  • مشاريع كبيرة
  • فرق متعددة

🧩 تخيلها بشكل بسيط

🏢 التطبيق مثل شركة

  • 🎨 UI = موظف الاستقبال
  • 🧠 Cubit/BLoC = المدير
  • 📦 Repository = المسؤول عن البيانات
  • 🌐 API = المورد الخارجي

🔥 خلاصة احترافية

أفضل Structure في Flutter:

UI

Cubit / BLoC

Repository

Data Source