Function in dart (2)

✅ أولًا: ما هي الدوال المجهولة (Anonymous Function)؟

هي دوال ليس لها اسم، وتُستخدم غالبًا:

  • كمُعامل داخل دوال أخرى.
  • أو عندما تكون الدالة بسيطة ولا حاجة لتكرارها.

يتم تعريفها مثل أي دالة، ولكن دون اسم.

✅ الصيغة العامة:
(parameter1, parameter2, ...) {
  // جسم الدالة
};
JavaScript
✅ المميزات والفوائد:
الفائدةالشرح
✅ بدون اسملا تحتاج لتعريف اسم للدالة — مفيدة للكود المؤقت أو البسيط.
✅ تستخدم داخل المتغيرات أو القوائم أو الدوالمثالية عند الحاجة لدالة لمرة واحدة فقط.
✅ تدعم الوصول للمتغيرات من السياق الخارجي (Closure)يمكن استخدامها للوصول إلى متغيرات من المحيط.
✅ تسهّل العمل مع الدوال التي تتطلب Callbacksمثل forEach, map, where, أو في واجهات المستخدم.
✅ أين تُستخدم؟
  • داخل توابع مثل forEach, map, sort.
  • كمُعامل (callback) في أزرار الضغط أو الأحداث في تطبيقات Flutter.
  • في تعريف المتغيرات التي تمثل دالة.
  • في عمليات الفلترة أو التحويل على القوائم.
✅ 🧪 الأمثلة التفصيلية:
مثال 1: استخدام Anonymous Function مع forEach
void main() {
  List<String> names = ['Yasin', 'Ali', 'Sara'];

  names.forEach((name) {
    print("Hello $name");
  });
}
JavaScript
  • forEach تتوقع دالة كمُعامل.
  • أعطيناها دالة مجهولة تطبع الاسم.
مثال 2: تخزين دالة مجهولة في متغير
🧾 الشرح:
void main() {
  var greet = () {
    print("Welcome to Dart!");
  };

  greet(); // استدعاء الدالة المجهولة من المتغير
}
JavaScript
🧾 الشرح:
  • خزّنا الدالة في متغير.
  • أصبح بإمكاننا استخدامها مثل أي دالة عادية.
مثال 3: دالة مجهولة تُرجع قيمة
void main() {
  var getNumber = () {
    return 42;
  };

  print("Lucky Number: ${getNumber()}");
}
JavaScript
🧾 الشرح:
  • دالة بدون اسم تعيد رقم.
  • تم تخزينها في متغير واستدعاؤها لاحقًا.
مثال 4: استخدام في map لتحويل قائمة
void main() {
  List<int> numbers = [1, 2, 3];

  List<int> squared = numbers.map((num) {
    return num * num;
  }).toList();

  print(squared); // [1, 4, 9]
}
JavaScript
✅ الفرق بينها وبين الدوال العادية:
المقارنةدالة عاديةدالة مجهولة
لها اسم؟✅ نعم❌ لا
إعادة الاستخدام؟✅ ممكن بسهولة❌ صعب إلا بحفظها في متغير
مكان التعريفغالبًا خارج الدوالغالبًا داخل دوال أخرى
✅ محاذير وملاحظات:
  • لا تستخدم الدوال المجهولة إذا كانت المهمة معقدة أو متكررة — الأفضل وقتها استخدام دالة عادية باسم واضح.
  • إن أردت أن تكون الدالة المجهولة تعود بقيمة، تأكد من استخدام return بداخلها.
  • يمكن أن تكون async أو => أيضًا: dartCopyEditvar greet = () => print("Hi from arrow anonymous function!");
✅ الخلاصة:
  • الدالة المجهولة = دالة بدون اسم، تُستخدم عادة داخل دوال أخرى أو لمهام بسيطة.
  • مفيدة جدًا في العمليات اللحظية والتعامل مع القوائم والأحداث.
  • يمكنها استقبال معطيات، إعادة قيم، وحتى أن تكون async.
✅ ما هي الدوال السهمية (Arrow Functions) في Dart؟
📌 التعريف:

الدالة السهمية هي اختصار لكتابة الدالة التي تحتوي على تعليم واحد فقط (سطر واحد)، باستخدام الرمز => بدلاً من { return ...; }.

✅ الصيغة العامة:
returnType functionName(parameters) => expression;
JavaScript
  • لا تحتاج إلى {} أو return.
  • تستخدم فقط إذا كان هناك سطر واحد فقط في جسم الدالة.
✅ مثال بسيط:
int square(int x) => x * x;

void main() {
  print(square(4)); // 16
}
JavaScript
✅ مقارنة بين الدالة العادية والسهمية:
الدالة العاديةالدالة السهمية
int add(int x, int y) { return x + y; }int add(int x, int y) => x + y;
تحتاج إلى {} و returnتستخدم => وتستغني عن return
تصلح لأي تعبيرتصلح فقط لسطر واحد
✅ المميزات والفوائد:
الميزةالفائدة
✅ كتابة مختصرةتجعل الكود أنظف وأسهل للقراءة.
✅ مثالية للوظائف البسيطةمثل الحسابات أو التحويلات السريعة.
✅ تُستخدم مع الدوال الأخرىمفيدة جدًا في map, forEach, sort, إلخ.
✅ تدعم أنواع الإرجاع مثل العاديةسواء int, String, void, إلخ.
✅ أمثلة توضيحية متنوعة:
🧪 مثال 1: دالة ترجّع عدد مربع
int square(int x) => x * x;

void main() {
  print(square(5)); // 25
}
JavaScript
🧪 مثال 2: دالة بدون إرجاع (void)
void greet() => print("Hello, Yasin!");

void main() {
  greet(); // Hello, Yasin!
}
JavaScript
🧪 مثال 3: دالة سهمية تستخدم داخل map
void main() {
  List<int> numbers = [1, 2, 3];
  var doubled = numbers.map((n) => n * 2).toList();

  print(doubled); // [2, 4, 6]
}
JavaScript
🧪 مثال 4: دالة سهمية ترجع شرط منطقي
bool isEven(int x) => x % 2 == 0;

void main() {
  print(isEven(4)); // true
  print(isEven(7)); // false
}
JavaScript
⚠️ المحاذير والتنبيهات:
التحذيرالسبب
❌ لا تستخدم إذا كانت الدالة تحتوي على أكثر من سطرالدوال السهمية مخصصة لسطر واحد فقط.
❌ لا يمكن استخدام return داخل =>لأن Dart تفترض أن السطر الوحيد هو ما سيتم إرجاعه.
❌ تجنب استخدامها في العمليات المعقدةللحفاظ على وضوح الكود.
✅ متى تستخدم الدوال السهمية؟
الاستخدامهل تُناسب الدوال السهمية؟
دالة قصيرة (حساب – شرط – طباعة)✅ نعم
أكثر من سطر واحد (مثل if أو for)❌ لا
داخل map / where / sort✅ مثالي
داخل واجهات المستخدم Flutter✅ شائع جداً
✅ ملخص سريع:
النوعالصيغةمناسب لـ
دالة سهمية ترجع قيمةint f(x) => x * x;الحسابات السريعة
دالة سهمية voidvoid f() => print("Hello");الطباعة
في maplist.map((x) => x + 1)تعديل عناصر القوائم