Sound Null Safety (Dart)

  • Dart بتفرض إن كل متغير يكون إما non-nullable (لا يقبل null) أو nullable (تضيف ?).
  • لو كتبت String name; لازم تعطيه قيمة قبل ما تستخدمه، أما String? name; يبقى ممكن يكون null.
  • الفايدة: الكومبايلر يضمن إنك ما تستخدمش قيمة null بدون ما تتأكد منها، فبيقلل الأخطاء اللي تظهر وقت التشغيل.
  • لما تتعامل مع nullable، استخدم:
    • if (name != null) … قبل الاستخدام.
    • name! عشان تقول “أنا متأكد إنها مش null” (بس خليك حذر).
    • name?.length عشان تستدعي property بس لو مش null.
  • آرزتك (libraries) كمان لازم تكتب null-safe عشان تتوافق، وتقدر تشغل dart migrate علشان تترفع لمستوى Null Safety في مشروعك.

Null Pointer Exception (خطأ الوصول إلى null)

  • يحصل لما تحاول تستخدم قيمة null كأنها موجودة: مثلاً تستدعي name.length لما name نفسها null.
  • Dart مع Sound Null Safety يمنعك من ده لأنك لازم تكتب String? name لو ممكن تكون فارغة، وcompilier يطلب منك تتحقق قبل الاستخدام.
  • لو اشتغلت في كود قديم أو جبت بيانات من API، استخدم:
    • if (name != null) { print(name.length); }
    • name?.length → لما name null يعطي null بدون خطأ.
    • name ?? 'default' → يدي قيمة احتياطية لو null.
  • لو بتحصل لك Null Pointer في تطبيق لاراڤيل/سيرفر، راجع الـ data أو الـ request اللي داخلة وتأكد المتغيرات ما فيهاش null قبل ما تقابلها.
  • حابب أوريك مثال عملي بلغة Dart أو نضيف helper function للتحقق؟
dart
void main() {
  String? greeting;
  print(greeting.length); 
}

في الكود ده greeting معرف كـ String? يعني ممكن تكون null. لما تكتب greeting.length، Dart ترفض لأنك بتحاول تشوف طول قيمة ممكن تكون null → ده اللي بيسبب Null Pointer exception.

الحل:

dart
void main() {
  String? greeting;
  print(greeting?.length); // يطبع null بدل ما يكسّر
}

أو تعطي قيمة افتراضية قبل ما تستخدمها:

dart
print(greeting?.length ?? 0);

ولو متأكد إنها مش هتكون null في اللحظة دي:

dart
print(greeting!.length);

لكن خليك حذر مع !؛ استخدمه بس لما تكون متأكد 100%.

Null-Safe Operators (Dart)

  • ?. calls a member only if the value isn’t null: greeting?.lengthnull if greeting is null, otherwise length.
  • ?? gives a fallback: greeting ?? "hi" returns "hi" when greeting is null.
  • ??= assigns only when null: greeting ??= "hello" sets it if not already set.
  • ! asserts non-null: greeting!.length tells Dart “I know this isn’t null”—use only when you’re sure, otherwise runtime error.
  • ?.. is like ?. but for cascades: myList?..add(1) only runs if myList isn’t null.

هذه الأدوات تحميك من Null Pointer errors وتخلي الكود أنظف. تريد أعمل مثال عملي بأي واحد فيهم؟

late