في الاصدار 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',
),
),
المصادر