(1) MAP IN DART

🧠 ما هي Map في Dart؟

Map هي بنية بيانات (Data Structure) تُستخدم لتخزين أزواج من المفتاح والقيمة (key => value).
كل مفتاح في Map يجب أن يكون فريدًا، ولكن القيم يمكن أن تتكرر.

تشبه Dictionary في Python أو Object في JavaScript.

✅ تعريف بسيط:
void main() {
  Map<String, int> ages = {
    'Ali': 25,
    'Sara': 30,
    'Omar': 22,
  };

  print(ages['Sara']); // 30
}
PHP
✅ طريقة إنشاء Map
1. باستخدام الأقواس {}:
Map<String, int> myMap = {'a': 1, 'b': 2};
PHP
2. باستخدام الدالة Map():
Map<String, String> cities = Map();
cities['Egypt'] = 'Cairo';
cities['France'] = 'Paris';
PHP
3. خريطة فارغة:
Map<String, int> empty = {};
PHP
📌 الخصائص الأساسية
الخاصية / الدالةالوصف
map[key]الوصول للقيمة المرتبطة بالمفتاح
map[key] = valueتعيين قيمة لمفتاح
addAll({})إضافة عناصر جديدة
containsKey(key)التحقق من وجود مفتاح
containsValue(value)التحقق من وجود قيمة
remove(key)حذف عنصر
lengthعدد العناصر
isEmpty / isNotEmptyهل الخريطة فارغة؟
clear()حذف جميع العناصر
🧪 أمثلة عملية
🔹 إضافة وتعديل القيم:
var user = {'name': 'Yasin', 'age': 26};
user['age'] = 27; // تعديل
user['country'] = 'Egypt'; // إضافة
PHP
🔹 التكرار على Map:
user.forEach((key, value) {
  print('$key: $value');
});
PHP

أو باستخدام for in:

for (var entry in user.entries) {
  print('${entry.key} => ${entry.value}');
}
PHP
🔍 البحث والتحقق
print(user.containsKey('name'));  // true
print(user.containsValue('Egypt')); // true
PHP
🔁 تحويل Map إلى List
var keys = user.keys.toList();      // ['name', 'age', 'country']
var values = user.values.toList();  // ['Yasin', 27, 'Egypt']
PHP
🧩 التحديث المشروط
user.update('name', (oldValue) => 'Ahmed'); // إذا وُجد
user.update('city', (v) => 'Cairo', ifAbsent: () => 'Cairo'); // إذا لم يوجد
PHP
🔥 حذف عنصر
user.remove('age');
PHP
🧠 استخدام Map المتداخلة
Map<String, Map<String, dynamic>> students = {
  'Ali': {'age': 22, 'grade': 'A'},
  'Sara': {'age': 23, 'grade': 'B'},
};

print(students['Ali']?['grade']); // A
PHP
⚠️ محاذير هامة
المحذورالتوضيح
تعديل القيم أثناء التكرارقد يسبب خطأ أو نتائج غير متوقعة
المفاتيح لا تُكررإدخال مفتاح موجود مسبقًا يستبدل القديم
Map غير مرتبة (في النوع العادي)استخدم LinkedHashMap إذا أردت الحفاظ على الترتيب
استخدام كائن كـ key بدون hashCodeسيتسبب في سلوك غير متوقع
🏗️ أنواع Map في Dart
النوعالوصف
Map (الافتراضي)غير مرتب
LinkedHashMapيحافظ على ترتيب الإدخال
SplayTreeMapيُرتب المفاتيح تلقائيًا
HashMapأسرع نوع، لا يحافظ على ترتيب
مثال:
import 'dart:collection';

void main() {
  var map = SplayTreeMap<String, int>();
  map['c'] = 3;
  map['a'] = 1;
  map['b'] = 2;

  print(map); // {a: 1, b: 2, c: 3}
}
PHP
✅ الفرق بين Map و Set و List
الخاصيةMapSetList
نوع المحتوىمفتاح => قيمةقيمة فريدة فقطأي قيم (تكرار مسموح)
ترتيب العناصر؟لا (إلا LinkedHash)لا (إلا LinkedHashSet)نعم
يقبل التكرار؟لا للمفاتيحلانعم
الوصول للعناصربالمفتاحلا يوجد فهرسبالفهرس
🧠 متى أستخدم Map؟

استخدم Map عندما:

  • تحتاج إلى ربط مفتاح بقيمة (مثل: الاسم => العمر)
  • تحتاج إلى البحث السريع بالقيمة المرتبطة بمفتاح
  • تحتاج إلى تمثيل JSON
  • تخزين بيانات منظمة لها معرف
📦 مثال عملي نهائي
Map<String, dynamic> product = {
  'id': 101,
  'name': 'Laptop',
  'price': 1500,
  'available': true,
};

print('اسم المنتج: ${product['name']}');
if (product.containsKey('price')) {
  print('السعر: ${product['price']}');
}
product['price'] = 1400; // تعديل السعر
product.remove('available');

print('المنتج النهائي:');
product.forEach((k, v) => print('$k => $v'));
PHP