أساسيات لغة Dart: المتغيرات وأنواع البيانات برمجياً


ماذا سنتعلم؟

سنتعمق في فهم كيفية تعريف واستخدام المتغيرات في Dart، بالإضافة إلى استكشاف أنواع البيانات الأساسية وكيفية التفاعل معها برمجياً لإنشاء تطبيقات قوية.

1. تعريف المتغيرات الأساسية: الأعداد والنصوص

في هذه الخطوة، سنتعلم كيفية تعريف المتغيرات الأساسية مثل الأعداد الصحيحة (int)، الأعداد العشرية (double)، والنصوص (String). سنتطرق أيضاً إلى استخدام الكلمة المفتاحية var التي تتيح لـ Dart استنتاج نوع المتغير تلقائياً.

void main() {
  // تعريف متغير من نوع عدد صحيح (Integer)
  int age = 30;
  // تعريف متغير من نوع عدد عشري (Double)
  double price = 99.99;
  // تعريف متغير من نوع نص (String)
  String name = "أحمد";
  // استخدام 'var' لترك Dart تستنتج نوع المتغير بناءً على القيمة الأولية
  var message = "مرحباً بكم في درس Dart!";

  print("الاسم: $name"); // طباعة قيمة المتغير name
  print("العمر: $age سنة"); // طباعة قيمة المتغير age
  print("السعر: $price ريال"); // طباعة قيمة المتغير price
  print(message); // طباعة رسالة الترحيب
}
ملاحظة تقنية: var مفيد للاختصار، لكن تحديد النوع صراحةً (مثل int أو String) يزيد من وضوح الكود وقابليته للصيانة، خاصة في المشاريع الكبيرة.

2. التعامل مع القيم المنطقية والقوائم

تعتبر القيم المنطقية (bool) والقوائم (List) من أنواع البيانات الشائعة جداً. القيم المنطقية تستخدم لتمثيل الحالات صح/خطأ، بينما القوائم تخزن مجموعة من العناصر من نفس النوع أو أنواع مختلفة.

void main() {
  // تعريف متغير منطقي (Boolean) بقيمة صحيحة
  bool isActive = true;
  // تعريف قائمة (List) من النصوص (String)
  List<String> fruits = ["تفاح", "برتقال", "موز"];
  // تعريف قائمة (List) من الأعداد الصحيحة باستخدام 'var'
  var numbers = [1, 2, 3, 4, 5];

  print("هل المستخدم نشط؟ $isActive"); // طباعة حالة النشاط
  print("الفاكهة الأولى: ${fruits[0]}"); // الوصول للعنصر الأول في القائمة (التفاح) باستخدام الفهرس 0
  print("جميع الأرقام: $numbers"); // طباعة القائمة كاملة
}
ملاحظة تقنية: القوائم في Dart مبنية على الفهرسة الصفرية (zero-indexed)، أي أن العنصر الأول يكون في الفهرس 0، الثاني في الفهرس 1 وهكذا.

3. استخدام الخرائط والمتغيرات الثابتة (final و const)

الخرائط (Map) تسمح بتخزين البيانات كأزواج من المفتاح والقيمة، وهي مفيدة جداً لتمثيل الكائنات أو السجلات. سنتعرف أيضاً على final و const لتحديد المتغيرات التي لا تتغير قيمتها.

void main() {
  // تعريف خريطة (Map) لتخزين بيانات المستخدم، حيث المفاتيح نصوص والقيم يمكن أن تكون أي نوع (dynamic)
  Map<String, dynamic> user = {
    'name': 'ليلى',
    'age': 25,
    'city': 'الرياض',
    'isStudent': false,
  };

  // تعريف متغير ثابت (final) لا يمكن تغيير قيمته بعد التهيئة الأولى وقت التشغيل
  final String appName = "تطبيق إدارة المهام";
  // تعريف ثابت وقت التجميع (const) يجب أن تكون قيمته معروفة وقت التجميع ولا يمكن تغييرها مطلقاً
  const double PI = 3.14159;

  print("اسم المستخدم: ${user['name']}"); // الوصول إلى قيمة في الخريطة باستخدام المفتاح
  print("مدينة المستخدم: ${user['city']}");
  print("اسم التطبيق: $appName"); // طباعة الثابت final
  print("قيمة PI: $PI"); // طباعة الثابت const
}
ملاحظة تقنية: final يضمن أن المتغير يُهيأ مرة واحدة فقط وقت التشغيل، بينما const يتطلب أن تكون القيمة معروفة وقت التجميع، مما يجعله أكثر كفاءة للقيم الثابتة تماماً والتي لا تتغير أبداً.

الكود النهائي الكامل

هذا هو الكود المجمع الذي يوضح جميع أنواع المتغيرات وأنواع البيانات التي تعلمناها في هذا الدرس.

void main() {
  // --- قسم تعريف المتغيرات الأساسية: الأعداد والنصوص --- 
  int age = 30; // تعريف متغير من نوع عدد صحيح (Integer)
  double price = 99.99; // تعريف متغير من نوع عدد عشري (Double)
  String name = "أحمد"; // تعريف متغير من نوع نص (String)
  var message = "مرحباً بكم في درس Dart!"; // استخدام 'var' لترك Dart تستنتج النوع

  print("--- المتغيرات الأساسية ---");
  print("الاسم: $name");
  print("العمر: $age سنة");
  print("السعر: $price ريال");
  print(message);
  print(""); // سطر فارغ للفصل بين الأقسام

  // --- قسم التعامل مع القيم المنطقية والقوائم ---
  bool isActive = true; // تعريف متغير منطقي (Boolean)
  List<String> fruits = ["تفاح", "برتقال", "موز"]; // تعريف قائمة من النصوص
  var numbers = [1, 2, 3, 4, 5]; // قائمة من الأعداد الصحيحة باستخدام 'var'

  print("--- القيم المنطقية والقوائم ---");
  print("هل المستخدم نشط؟ $isActive");
  print("الفاكهة الأولى: ${fruits[0]}");
  print("جميع الأرقام: $numbers");
  print(""); // سطر فارغ للفصل بين الأقسام

  // --- قسم استخدام الخرائط والمتغيرات الثابتة ---
  Map<String, dynamic> user = { // تعريف خريطة لتخزين بيانات المستخدم
    'name': 'ليلى',
    'age': 25,
    'city': 'الرياض',
    'isStudent': false,
  };

  final String appName = "تطبيق إدارة المهام"; // متغير ثابت (final)
  const double PI = 3.14159; // ثابت وقت التجميع (const)

  print("--- الخرائط والمتغيرات الثابتة ---");
  print("اسم المستخدم: ${user['name']}");
  print("مدينة المستخدم: ${user['city']}");
  print("اسم التطبيق: $appName");
  print("قيمة PI: $PI");
}

النتيجة المتوقعة

عند تشغيل الكود أعلاه في بيئة Dart (مثل DartPad أو في مشروع Flutter)، ستحصل على المخرجات التالية في وحدة التحكم (Console):

--- المتغيرات الأساسية ---
الاسم: أحمد
العمر: 30 سنة
السعر: 99.99 ريال
مرحباً بكم في درس Dart!

--- القيم المنطقية والقوائم ---
هل المستخدم نشط؟ true
الفاكهة الأولى: تفاح
جميع الأرقام: [1, 2, 3, 4, 5]

--- الخرائط والمتغيرات الثابتة ---
اسم المستخدم: ليلى
مدينة المستخدم: الرياض
اسم التطبيق: تطبيق إدارة المهام
قيمة PI: 3.14159