# Sound Null Safety (Dart)

---

**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?.length` → `null` 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]]