المتغيرات والأنواع في Dart
كل تطبيق Flutter ستبنيه مليء بالبيانات: اسم المستخدم، وعدد العناصر في السلة، وهل الوضع الليلي مفعّل. وكل هذه البيانات تُحفظ في متغيرات. في هذا الدرس ستتعلم كيف تعرّف المتغيرات في Dart، وما أنواعها، ولماذا تهتم Dart كثيراً بمعرفة نوع كل قيمة.
تعريف المتغير بـ var
Section titled “تعريف المتغير بـ var”void main() { var name = 'سارة'; var age = 14; print(name); print(age);}سارة14المتغير مثل صندوق عليه ملصق: الملصق اسمه، وبداخله القيمة. والكلمة var تعني «أنشئ متغيراً، واستنتج نوعه من القيمة». هنا تفهم Dart وحدها أن name نص، و age رقم صحيح.
لكن انتبه: Dart لغة ثابتة الأنواع (Statically Typed). بعد أن يُحدَّد نوع المتغير، لا يمكن أن تضع فيه نوعاً آخر. لو كتبت age = 'أربعة عشر'; سيرفض المحرر الكود قبل أن تشغّله. هذه الصرامة تكشف كثيراً من الأخطاء مبكراً، وهي من أسباب قوة Dart في التطبيقات الكبيرة.
الأنواع الأساسية
Section titled “الأنواع الأساسية”يمكنك كتابة النوع صراحة بدلاً من var:
String city = 'القاهرة';int students = 30;double price = 12.5;bool isOpen = true;| النوع | يخزن | مثال |
|---|---|---|
int |
أعداد صحيحة | 30 و -5 |
double |
أعداد عشرية | 12.5 و 3.0 |
num |
أي رقم: صحيح أو عشري | 9 ثم 9.5 |
String |
نصوص بين علامتي تنصيص | 'مرحباً' |
bool |
صح أو خطأ | true و false |
لاحظ أن String يبدأ بحرف كبير، بينما int و double و bool بحروف صغيرة. ولمعرفة نوع أي قيمة أثناء التشغيل استخدم runtimeType:
print(price.runtimeType);doubleمتى تستخدم var ومتى تكتب النوع؟ الأسلوب الشائع في مجتمع Dart: استخدم var للمتغيرات المحلية عندما يكون النوع واضحاً من القيمة، واكتب النوع صراحة عندما يزيد الوضوح.
final و const: قيم لا تتغير
Section titled “final و const: قيم لا تتغير”كثير من القيم لا يجب أن تتغير بعد إنشائها. Dart تعطيك كلمتين لذلك:
final today = 'الأحد';const pi = 3.14;final: تُسند مرة واحدة فقط، لكن قيمتها قد تُعرف أثناء التشغيل، مثل الوقت الحالي أو بيانات وصلت من الإنترنت.const: قيمة معروفة قبل التشغيل، أثناء كتابة الكود نفسه، مثل الثوابت الرياضية.
تخيّل final مثل تاريخ ميلادك في شهادتك: لا يتغير أبداً، لكنه لم يكن معروفاً قبل ولادتك. أما const فمثل عدد أيام الأسبوع: معروف دائماً ومنذ البداية.
النصوص وإدراج القيم
Section titled “النصوص وإدراج القيم”النصوص تُكتب بعلامات مفردة '...' أو مزدوجة "..."، والمفردة هي الأشهر في Dart. ولوضع قيمة متغير داخل النص استخدم $:
var first = 'أحمد';var points = 7;print('اسمي $first');print('بعد المكافأة: ${points + 3} نقاط');print('طول الاسم: ${first.length} حروف');اسمي أحمدبعد المكافأة: 10 نقاططول الاسم: 4 حروف$first: لمتغير بسيط.${...}: لأي تعبير: عملية حسابية، أو خاصية مثل.length.
لاحظ أن length في Dart تحسب الحروف العربية بشكل صحيح: «أحمد» أربعة حروف.
وللنصوص متعددة الأسطر استخدم ثلاث علامات تنصيص:
var poem = '''سطر أولسطر ثانٍ''';print(poem);العمليات الحسابية
Section titled “العمليات الحسابية”print(10 / 4); // قسمة عاديةprint(10 ~/ 4); // قسمة صحيحةprint(10 % 4); // باقي القسمة2.522انتبه: القسمة / في Dart تُرجع دائماً double حتى لو كانت النتيجة عدداً صحيحاً. وإذا أردت قسمة صحيحة بلا كسور فاستخدم ~/.
التحويل بين الأنواع
Section titled “التحويل بين الأنواع”البيانات التي يكتبها المستخدم في حقل إدخال تصل كنص دائماً. لتحويلها لرقم:
var input = '25';int n = int.parse(input);print(n + 5);print(double.parse('2.5') * 2);print(42.toString() + '!');print(int.tryParse('abc'));305.042!nullint.parseوdouble.parse: من نص إلى رقم. إذا لم يكن النص رقماً صحيحاً يتوقف البرنامج بخطأ.int.tryParse: مثل السابقة، لكنها تُرجعnullبدل الخطأ. أأمن مع إدخال المستخدم.toString(): من أي قيمة إلى نص.
ستفهم معنى null بعمق في الدرس القادم عن Null Safety.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب برنامجاً لفاتورة صغيرة: ثلاثة ثوابت لاسم المنتج وسعره والكمية، ثم احسب الإجمالي واطبعه:
void main() { const productName = 'سماعة'; const unitPrice = 150.0; const quantity = 2; final total = unitPrice * quantity;
print('المنتج: $productName'); print('الإجمالي: $total جنيه');}المنتج: سماعةالإجمالي: 300.0 جنيهتحدٍّ: أضف متغيراً لنسبة الخصم، واطبع السعر بعد الخصم.
أخطاء شائعة
Section titled “أخطاء شائعة”- تغيير نوع المتغير:
var age = 14; age = 'كبير';خطأ. النوع يُحدَّد مرة واحدة. - محاولة تغيير final أو const: يرفضها المحرر فوراً. استخدم
varإذا كانت القيمة ستتغير فعلاً. - نسيان الأقواس في الإدراج:
'$first.length'تطبع الاسم ثم كلمة.length. الصحيح'${first.length}'.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج print(10 ~/ 3); في Dart؟
~/ قسمة صحيحة تحذف الكسر، فالنتيجة 3. أما 10 % 3 فتعطي الباقي 1.
سؤال
أي كلمة تناسب قيمة لا تتغير لكنها تُعرف أثناء تشغيل البرنامج فقط، مثل الوقت الحالي؟
final تُسند مرة واحدة ويمكن معرفة قيمتها أثناء التشغيل، أما const فيجب أن تكون معروفة قبل التشغيل.
الخلاصة
Section titled “الخلاصة”varتستنتج النوع، والنوع لا يتغير بعد ذلك لأن Dart ثابتة الأنواع.- الأنواع الأساسية:
intوdoubleوnumوStringوbool. finalلقيمة تُسند مرة واحدة، وconstلقيمة معروفة قبل التشغيل.$nameو${...}لإدراج القيم في النصوص./تُرجعdoubleدائماً، و~/للقسمة الصحيحة، وint.parseوtryParseللتحويل.