بحث باسم الموضوع المطلوب

في دالة copyWith العادية ما نقدر نميّز بين “ما تم تمرير قيمة” و”مررت قيمة فارغة null”، عشان لما نكتب مثلاً:

 


في دالة copyWith العادية ما نقدر نميّز بين “ما تم تمرير قيمة” و”مررت قيمة فارغة  null”، عشان لما نكتب مثلاً:


User copyWith({String? phone}) {

  return User(phone: phone ?? this.phone);

}

فلو مررت phone: null بيتعامل معها كأنك ما مررت شي ويرجع لك this.phone. 


❌️ وهنا تصير عندنا إشكالية إنه ما نقدر نغير القيمة لnull!!.


✔️الحل: استخدام الـ Sentinel Pattern


1. نعرّف const من نوع Object :


static const unchanged = Object();


2. نخلي القيمة الافتراضية لكل معامل في copyWith هذا الconst "مثلما موضح في الصوره" 


User copyWith({

  Object? name    = unchanged


📍 كيف يشتغل:


- إذا ما مررت قيمة: بيظل المعامل قيمته unchanged، فينسخ الحقل الأصلي (this.field).


- إذا مررت قيمة null: المعامل بيصير null مش unchanged، فيتحدّث الحقل إلى null.


ليش unchanged لازم تكون const؟

لأن دارت ما تسمحش بالقيمة الافتراضية للمعامل تكون غير ثابتة (compile‑time constant)، وبـ const نضمن إنه فيه كائن واحد بس نقدر نقارن هويته  (==) عشان نعرف إذا ما تغيّرش المعامل أصلاً.