تخطَّ إلى المحتوى

المتغيرات والأنواع في Dart

الدرس 2 من 14 · Dart

كل تطبيق Flutter ستبنيه مليء بالبيانات: اسم المستخدم، وعدد العناصر في السلة، وهل الوضع الليلي مفعّل. وكل هذه البيانات تُحفظ في متغيرات. في هذا الدرس ستتعلم كيف تعرّف المتغيرات في Dart، وما أنواعها، ولماذا تهتم Dart كثيراً بمعرفة نوع كل قيمة.

void main() {
var name = 'سارة';
var age = 14;
print(name);
print(age);
}
الناتج
سارة
14

المتغير مثل صندوق عليه ملصق: الملصق اسمه، وبداخله القيمة. والكلمة var تعني «أنشئ متغيراً، واستنتج نوعه من القيمة». هنا تفهم Dart وحدها أن name نص، و age رقم صحيح.

لكن انتبه: Dart لغة ثابتة الأنواع (Statically Typed). بعد أن يُحدَّد نوع المتغير، لا يمكن أن تضع فيه نوعاً آخر. لو كتبت age = 'أربعة عشر'; سيرفض المحرر الكود قبل أن تشغّله. هذه الصرامة تكشف كثيراً من الأخطاء مبكراً، وهي من أسباب قوة Dart في التطبيقات الكبيرة.

يمكنك كتابة النوع صراحة بدلاً من 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 للمتغيرات المحلية عندما يكون النوع واضحاً من القيمة، واكتب النوع صراحة عندما يزيد الوضوح.

كثير من القيم لا يجب أن تتغير بعد إنشائها. Dart تعطيك كلمتين لذلك:

final today = 'الأحد';
const pi = 3.14;
  • final: تُسند مرة واحدة فقط، لكن قيمتها قد تُعرف أثناء التشغيل، مثل الوقت الحالي أو بيانات وصلت من الإنترنت.
  • const: قيمة معروفة قبل التشغيل، أثناء كتابة الكود نفسه، مثل الثوابت الرياضية.

تخيّل final مثل تاريخ ميلادك في شهادتك: لا يتغير أبداً، لكنه لم يكن معروفاً قبل ولادتك. أما const فمثل عدد أيام الأسبوع: معروف دائماً ومنذ البداية.

النصوص تُكتب بعلامات مفردة '...' أو مزدوجة "..."، والمفردة هي الأشهر في Dart. ولوضع قيمة متغير داخل النص استخدم $:

var first = 'أحمد';
var points = 7;
print('اسمي $first');
print('بعد المكافأة: ${points + 3} نقاط');
print('طول الاسم: ${first.length} حروف');
الناتج
اسمي أحمد
بعد المكافأة: 10 نقاط
طول الاسم: 4 حروف
  • $first: لمتغير بسيط.
  • ${...}: لأي تعبير: عملية حسابية، أو خاصية مثل .length.

لاحظ أن length في Dart تحسب الحروف العربية بشكل صحيح: «أحمد» أربعة حروف.

وللنصوص متعددة الأسطر استخدم ثلاث علامات تنصيص:

var poem = '''
سطر أول
سطر ثانٍ''';
print(poem);
print(10 / 4); // قسمة عادية
print(10 ~/ 4); // قسمة صحيحة
print(10 % 4); // باقي القسمة
الناتج
2.5
2
2

انتبه: القسمة / في Dart تُرجع دائماً double حتى لو كانت النتيجة عدداً صحيحاً. وإذا أردت قسمة صحيحة بلا كسور فاستخدم ~/.

البيانات التي يكتبها المستخدم في حقل إدخال تصل كنص دائماً. لتحويلها لرقم:

var input = '25';
int n = int.parse(input);
print(n + 5);
print(double.parse('2.5') * 2);
print(42.toString() + '!');
print(int.tryParse('abc'));
الناتج
30
5.0
42!
null
  • int.parse و double.parse: من نص إلى رقم. إذا لم يكن النص رقماً صحيحاً يتوقف البرنامج بخطأ.
  • int.tryParse: مثل السابقة، لكنها تُرجع null بدل الخطأ. أأمن مع إدخال المستخدم.
  • toString(): من أي قيمة إلى نص.

ستفهم معنى null بعمق في الدرس القادم عن Null Safety.

اكتب برنامجاً لفاتورة صغيرة: ثلاثة ثوابت لاسم المنتج وسعره والكمية، ثم احسب الإجمالي واطبعه:

void main() {
const productName = 'سماعة';
const unitPrice = 150.0;
const quantity = 2;
final total = unitPrice * quantity;
print('المنتج: $productName');
print('الإجمالي: $total جنيه');
}
الناتج المتوقع
المنتج: سماعة
الإجمالي: 300.0 جنيه

تحدٍّ: أضف متغيراً لنسبة الخصم، واطبع السعر بعد الخصم.

  • تغيير نوع المتغير: var age = 14; age = 'كبير'; خطأ. النوع يُحدَّد مرة واحدة.
  • محاولة تغيير final أو const: يرفضها المحرر فوراً. استخدم var إذا كانت القيمة ستتغير فعلاً.
  • نسيان الأقواس في الإدراج: '$first.length' تطبع الاسم ثم كلمة .length. الصحيح '${first.length}'.

سؤال

ما ناتج print(10 ~/ 3); في Dart؟

سؤال

أي كلمة تناسب قيمة لا تتغير لكنها تُعرف أثناء تشغيل البرنامج فقط، مثل الوقت الحالي؟

  • var تستنتج النوع، والنوع لا يتغير بعد ذلك لأن Dart ثابتة الأنواع.
  • الأنواع الأساسية: int و double و num و String و bool.
  • final لقيمة تُسند مرة واحدة، و const لقيمة معروفة قبل التشغيل.
  • $name و ${...} لإدراج القيم في النصوص.
  • / تُرجع double دائماً، و ~/ للقسمة الصحيحة، و int.parse و tryParse للتحويل.