ما هي List.generate؟
List.generate هي دالة منشئ (constructor) في Dart تُنشئ List بعنصر محدد العدد، كل عنصر ينتجه دالة مُولِّدة (generator) تعتمد على الفهرس (index).
باختصار: تُستخدم بسرعة لصنع قائمة من عناصر مُهيَّأة بحسب رقمها بدلاً من كتابتها يدوياً.
الصيغة (syntax)
List<T>.generate(
int length,
T generator(int index),
{ bool growable = false }
)
length: عدد العناصر في القائمة.generator: دالة تستقبلindex(من 0 إلى length-1) وترجع قيمة لكل عنصر.growable(اختياري) : إن أردت قائمة قابلة للتوسع (افتراضيfalse).
نقاط مهمة
- القائمة تُبنى فوراً (eager) — كل العناصر تُنشأ عند استدعاء
List.generate.- إذا تحتاج إلى إنشاء عناصر بشكل كسول (lazy)، استخدم
Iterable.generate(...)أوListView.builderداخل Flutter لواجهات كبيرة.
- إذا تحتاج إلى إنشاء عناصر بشكل كسول (lazy)، استخدم
- الفهرس يبدأ من 0 حتى
length - 1. - إذا كانت عناصرك غير قابلة للـnull، لا تُرجع
nullمن الـgenerator. growable: trueيجعل القائمة قابلة للإضافة/الإزالة لاحقًا.
body: Center(
child: ListView(
children: [
...List.generate(students.length, (index) {
return Card(
child: ListTile(
title: Text(students[index]["name"]),
subtitle: Text(students[index]["age"].toString()),
leading: Text("$index" , style: TextStyle(fontSize: 20),),
),
);
}),
],
),
),PHPأمثلة واضحة
1) قائمة أعداد (بسيط)
final nums = List<int>.generate(5, (i) => i * 2);
// الناتج: [0, 2, 4, 6, 8]
2) قائمة سلاسل نصية
final names = List<String>.generate(3, (i) => 'Item ${i + 1}');
// الناتج: ['Item 1', 'Item 2', 'Item 3']
3) قائمة قابلة للتمدد (growable)
final a = List<int>.generate(3, (i) => i + 1, growable: true);
// a = [1,2,3]
a.add(4); // أصبحت [1,2,3,4]
4) إنشاء مصفوفة ثنائية البُعد (matrix)
final rows = 3;
final cols = 4;
final matrix = List<List<int>>.generate(
rows,
(r) => List<int>.generate(cols, (c) => r * cols + c),
);
// matrix = [
// [0,1,2,3],
// [4,5,6,7],
// [8,9,10,11]
// ]
5) في Flutter — إنشاء Widgets بسرعة
// داخل build:
Column(
children: List<Widget>.generate(5, (i) => Text('عنصر $i')),
)
أو مع ListView (ملاحظة: List.generate يبني كل العناصر فوراً):
ListView(
children: List.generate(50, (i) => ListTile(title: Text('Item $i'))),
)
للقوائم الكبيرة استخدم
ListView.builderلأنه يبني عناصر فقط عند الحاجة (lazy).
6) استخدام مع spread operator
Column(
children: [
Text('عنوان'),
...List.generate(3, (i) => Text('بند ${i+1}')),
Text('نهاية'),
],
)
7) توليد نفس القيمة عدة مرات
إذا تريد نفس القيمة مكررة فالأفضل استخدام List.filled:
final fiveZeros = List<int>.filled(5, 0); // [0,0,0,0,0]
لكن إن أردت استخدام الـindex في التوليد فاستخدم List.generate.
متى أستخدم List.generate ومتى لا؟
- استخدمها عندما تريد قائمة جاهزة من عناصر تعتمد على الفهرس (مثلاً أزرار مرقّمة، نصوص متكررة).
- لا تستخدمها إن كانت القائمة كبيرة جدًا وتريد أداء أفضل في واجهة المستخدم — استعمل بدلاً منها
ListView.builderأوIterable.generateمع عمليات lazy.