📌 Named Parameters في دوال Dart

في Dart، يمكن تمرير المعاملات إلى الدالة باستخدام المعاملات المسماة (Named Parameters).
تُستخدم {} حول المعاملات لجعلها اختيارية أو إجبارية عند استدعاء الدالة.


🔹 1. تعريف المعاملات المسماة

📌 الصيغة العامة:

returnType functionName({Type param1, Type param2}) {
  // كود الدالة
}
Dart

🔹 يتم تحديد المعاملات داخل {} عند تعريف الدالة، مما يسمح بتمرير القيم عند الاستدعاء بترتيب عشوائي.


🔹 2. معامل مسمى اختياري (Optional Named Parameter)

🔹 عند استخدام {} فقط، يصبح المعامل اختياريًا وإذا لم يتم تمريره، ستكون قيمته null افتراضيًا.

✨ مثال 1: دالة تطبع بيانات المستخدم

void printUserInfo({String? name, int? age}) {
  print('الاسم: $name');
  print('العمر: $age');
}

void main() {
  printUserInfo(name: 'Ali', age: 25); // تمرير كل القيم
  printUserInfo(name: 'Sara');         // تمرير الاسم فقط
  printUserInfo();                      // عدم تمرير أي قيمة
}
Dart

🔹 الناتج:

الاسم: Ali
العمر: 25
الاسم: Sara
العمر: null
الاسم: null
العمر: null
Dart

📌 المعاملات تكون null إذا لم يتم تمريرها!


🔹 3. تعيين قيم افتراضية للمعاملات

🔹 يمكنك تجنب null من خلال تحديد قيمة افتراضية عند تعريف المعامل.

✨ مثال 2: تعيين قيم افتراضية

void printUserInfo({String name = 'غير معروف', int age = 18}) {
  print('الاسم: $name');
  print('العمر: $age');
}

void main() {
  printUserInfo(name: 'Ali', age: 25);  // إدخال جميع القيم
  printUserInfo(name: 'Sara');          // إدخال الاسم فقط
  printUserInfo();                       // عدم تمرير أي قيمة
}
Dart

🔹 الناتج:

الاسم: Ali
العمر: 25
الاسم: Sara
العمر: 18
الاسم: غير معروف
العمر: 18
Dart

📌 إذا لم يتم تمرير قيمة، يتم استخدام القيم الافتراضية.


🔹 4. استخدام required لجعل المعامل إلزاميًا

🔹 عند إضافة required، يصبح تمرير المعامل إجباريًا وإلا سيظهر خطأ أثناء التشغيل.

✨ مثال 3: دالة بمعاملات إلزامية (required)

void printUserInfo({required String name, required int age}) {
  print('الاسم: $name');
  print('العمر: $age');
}

void main() {
  printUserInfo(name: 'Ali', age: 25);  // ✅ صحيح
  // printUserInfo(name: 'Sara');       ❌ خطأ - العمر مطلوب
}
Dart

🔹 إذا لم يتم تمرير age، سيظهر خطأ عند التنفيذ.


🔹 5. دمج required مع القيم الافتراضية

🔹 يمكنك جعل بعض المعاملات إجبارية وبعضها اختياري مع قيمة افتراضية.

✨ مثال 4: مزيج بين required و القيم الافتراضية

void printUserInfo({required String name, int age = 18}) {
  print('الاسم: $name');
  print('العمر: $age');
}

void main() {
  printUserInfo(name: 'Ali', age: 25);  // ✅ صحيح
  printUserInfo(name: 'Sara');          // ✅ صحيح، العمر يأخذ 18 افتراضيًا
  // printUserInfo();                   ❌ خطأ - name مطلوب
}
Dart

🔹 name إلزامي، لكن age يحتوي على قيمة افتراضية 18.


🔹 6. تمرير معاملات بترتيب مختلف

📌 ميزة Named Parameters هي أنه يمكن تمرير القيم بأي ترتيب دون القلق بشأن ترتيب التعريف في الدالة.

✨ مثال 5: تمرير القيم بأي ترتيب

void displayInfo({required String name, required String city, int age = 18}) {
  print('الاسم: $name');
  print('المدينة: $city');
  print('العمر: $age');
}

void main() {
  displayInfo(name: 'Ali', city: 'Cairo');       // ✅ العمر سيأخذ القيمة الافتراضية
  displayInfo(city: 'Dubai', name: 'Sara');      // ✅ تمرير القيم بترتيب مختلف
}
Dart

🔹 الناتج:

الاسم: Ali
المدينة: Cairo
العمر: 18
الاسم: Sara
المدينة: Dubai
العمر: 18
Dart

🔹 الخلاصة

Named Parameters تجعل الكود أكثر وضوحًا ومرونة عند استدعاء الدالة.
✅ يمكن جعل المعاملات اختيارية باستخدام {}، أو إجبارية باستخدام required.
✅ يمكن تحديد قيم افتراضية للمعاملات لمنع null.
✅ يمكن تمرير القيم بأي ترتيب دون الحاجة إلى اتباع ترتيب تعريفها في الدالة.

💡 هل لديك أي استفسارات أو تحتاج إلى مزيد من الأمثلة؟ 😃🚀