خلّينا نضيف SnackBar بعد إضافة الملاحظة بشكل نظيف ومرتبط بالـ Cubit (مو من داخل الزر مباشرة) 🔥
🎯 الفكرة الصحيحة
Cubit يغيّر الحالة → UI يسمع → UI يعرض SnackBarDart❗ لا تعرض SnackBar داخل Cubit
❗ ولا داخل onPressed مباشرة
👉 الأفضل عبر BlocListener
🧱 1) تعديل الحالات (State)
📁 notes_state.dart
✏️ أضف حالة جديدة:
class NoteAdded extends NotesState {}Dart📄 الشكل الكامل:
abstract class NotesState {}
class NotesInitial extends NotesState {}
class NotesLoading extends NotesState {}
class NotesLoaded extends NotesState {
final List<Note> notes;
NotesLoaded(this.notes);
}
/// 👇 جديدة
class NoteAdded extends NotesState {}
class NotesError extends NotesState {
final String message;
NotesError(this.message);
}Dart🧠 ليش؟
نحتاج "إشارة" للـ UI أن العملية نجحتDart🧱 2) تعديل Cubit
📁 notes_cubit.dart
✏️ عدّل دالة addNote:
Future<void> addNote(Note note) async {
try {
await addNoteUseCase(note);
/// 👇 إشعار النجاح
emit(NoteAdded());
/// 👇 تحديث البيانات
fetchNotes();
} catch (e) {
emit(NotesError(e.toString()));
}
}Dart🧠 ماذا حدث؟
1. أضفنا Note
2. أرسلنا حالة نجاح
3. بعدها حدثنا القائمةDart🧱 3) استخدام BlocListener
📁 notes_page.dart
✏️ لف الصفحة بـ:
BlocListener<NotesCubit, NotesState>Dart📄 الكود
return BlocListener<NotesCubit, NotesState>(
listener: (context, state) {
/// 👇 عند النجاح
if (state is NoteAdded) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("تمت إضافة الملاحظة بنجاح"),
),
);
}
/// 👇 عند الخطأ
if (state is NotesError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(state.message),
),
);
}
},
child: Scaffold(
appBar: AppBar(title: const Text("الملاحظات")),
body: ...
),
);Dart🧠 ليش BlocListener؟
BlocBuilder = يعيد بناء UI
BlocListener = ينفذ actions (مثل SnackBar)Dart🔥 ماذا يحدث الآن؟
AddNotePage
↓
Cubit.addNote()
↓
emit(NoteAdded)
↓
NotesPage يسمع
↓
SnackBar يظهرDart💥 ملاحظة مهمة جداً
SnackBar يحتاج ScaffoldMessengerDart🎨 تحسين (اختياري)
AddNotePage
↓
Cubit.addNote()
↓
emit(NoteAdded)
↓
NotesPage يسمع
↓
SnackBar يظهرDart🧠 خلاصة قوية
Cubit → emit
Listener → show SnackBarDart🧠 الجملة الذهبية
Side effects go in BlocListener, not in UI buttonsDart