Extension Method في Dart

في الاصدار 2.7 من لغة Dart تم اضافة مميزات جديدة منها Extension Methode والتي تتيح لك امكانية اضافة الدوال الخاصة بك والتي تخدم تطبيقك في المكتبات والاضافات التي لا تخصك فيمكنك التعديل عليها بشكل سهل وبسيط.
ربما يكون التعريف السابق غير واضح لك ولكن دعنا نفترض انك تريد تحويل اول حرف من اسم الشخص باللغة الانجليزية الى حرف كبير، تعلم انه لا يوجد دالة. في Dart تتيح لك هذه الخاصية. سنقوم الان باضافة الى String تتيح لنا هذه الخاصية ✅ .

تعريف الدالة :

extension CapitalizeExtension on String {
  String get capitalizeFirstLetter {
    return this.isEmpty ? this : (this[0].toUpperCase() + this.substring(1));
  }
}

استخدامها:

الان يمكنك استخدام الدالة الجديدة وكأنها موجودة مسبقاً في API بهذا الشكل.

'name'.captiaalizeFirstLetter() \\ Name

هذه الدالة بشكل مبسط وطريقة استخدامها.

شكل البناء العام للدالة :

هذا هو الشكل العام اذا اردت كتابة دالة Extension جديدة.

extension <extension name> on <type> {
  (<member definition>)*
}

اذا كنت تريد استخدام الدالة فقط في Class معين او مكتبة معينة وتريد ان تجعلها private هناك طريقيتن اما ان تجعلها بدون اسم او ان تجعل بداية الاسم _ حتى تكون private .

انواع البيانات الثابتة والمتغيرة :

لايمكن استخدام دوال Extension مع المتغيرات dynamic على سبيل المثال الكود التالي لن يعمل

dynamic d = '2';
print(d.parseInt()); // Runtime exception: NoSuchMethodError

اما الشفرة التالية ستعمل لان var سيقوم باخذ نوع القيمة المسندة له وهي String

var v = '2';
print(v.parseInt()); // Output: 2

استخدامها مع Flutter

استخدام الـExtension في Flutter سيقوم باختصار الشفرة البرمجية بشكل كبير ويجعلها سهلة للمراجعة والقراءة اذا كنت تعاملت من قبل مع SwiftUI ستفهم المقصود.
في المثال التالي سنقوم باستبدال Padding Widget باستخدام Extension وسنقوم بمقارنة عدد الاسطر وسهولة تتبع وقراءة الكود.
سنقوم بانشاء دالة ونسميها Padding واضافة دالة داخلها باسم paddingAll

extension Padding on Widget {
  Padding paddingAll(double value, {Key key}) => Padding(
        key: key,
        padding: EdgeInsets.all(value),
        child: this,
      );
}

الان سنقوم باستخدام الدالة مع Widgets بهذا الشكل وبكل بساطة

Text(
   'Text',
).paddingAll(8)

جميل الان الكود بدون استهخدام دالة Extension

Padding(
 padding: const EdgeInsets.all(8.0),
 child: Text(
 'Text',
 ),
  ),
المصادر

Extension methods.

Dart Extension Methods Fundamentals

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *