List.generate

ما هي 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 لواجهات كبيرة.
  • الفهرس يبدأ من 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.