StatelessWidget: ما هو، المفاهيم الأساسية ومبدأ العمل

المؤلف: IT Sectr نُشر: 2026-06-30 وقت القراءة: 10 دق

StatelessWidget هو لبنة بناء أساسية لواجهة Flutter لا تخزن أو تعدل الحالة الداخلية بعد البناء. وفقًا للوثائق الرسمية لـ Flutter (Flutter.dev، 2026)، يشكل StatelessWidget ما يصل إلى 70% من جميع الـ widgets في التطبيق النموذجي، حيث يتولى العرض الثابت للبيانات: النص، الأيقونات، الصور، الحواف (padding)، والحاويات. على عكس StatefulWidget، يتم استدعاء وصف البناء الخاص به مرة واحدة أثناء التهيئة ويبقى دون تغيير حتى يعيد الأصل (parent) البناء.

النقاط الرئيسية

  • StatelessWidget — widget بدون حالة قابلة للتغيير يصف جزءًا من الواجهة لا يعتمد على بيانات تتغير بمرور الوقت
  • build method — الطريقة الوحيدة الإلزامية في StatelessWidget، والتي تُرجع شجرة الـ widgets ويتم استدعاؤها مرة واحدة عند الإدراج في الشجرة
  • الثبات (Immutability) — جميع حقول StatelessWidget تُعلن كـ final ولا يمكن تغييرها بعد إنشاء النسخة
  • الأداء — StatelessWidget أرخص من StatefulWidget، لأنه لا يتطلب إنشاء كائن State منفصل وإدارة دورة الحياة
  • المنشئات const — استخدام const يسمح لـ Flutter بتخزين الـ widget مؤقتًا وتخطي إعادة البناء بالكامل عند تطابق المعاملات

ما هو StatelessWidget؟

StatelessWidget هو فئة في إطار عمل Flutter مصممة لوصف جزء من واجهة المستخدم لا يعتمد على بيانات قابلة للتغيير. على عكس StatefulWidget، لا يحتوي StatelessWidget على حالة داخلية، ولا يستجيب لإدخال المستخدم، ولا يقوم بتحديث نفسه. مهمته الوحيدة هي قبول معاملات الإدخال (عبر المنشئ) وإرجاع وصف الواجهة من خلال طريقة build.

وفقًا لوثائق Flutter (Flutter.dev، مارس 2026)، يجب استخدام StatelessWidget لجميع عناصر الواجهة التي يمكن حسابها بناءً على المعاملات المُمررة ولا تتطلب عمليات غير متزامنة أو معالجة أحداث داخليًا. الأمثلة النموذجية: عرض النص (Text)، الأيقونات (Icon)، الحواف (Padding)، المحاذاة (Center) والحاويات (Container).

عند الاختيار بين StatelessWidget و StatefulWidget، ينطبق مبدأ الكفاية الدنيا — إذا كان بإمكان الـ widget العمل بدون حالة، فيجب أن يكون StatelessWidget. هذا يقلل الحمل على الإطار ويبسط التصحيح.

متى تستخدم StatelessWidget

StatelessWidget مثالي في ثلاثة سيناريوهات: عندما يتم تمرير البيانات عبر معاملات المنشئ ولا تتغير، عندما يكون الـ widget مكونًا من widgets ثابتة أخرى، وعندما يكون بناء واجهة المستخدم لمرة واحدة فقط. مثال على ذلك هو الـ widget ProfileHeader الذي يستلم اسمًا وصورة رمزية عبر المنشئ — بعد الإنشاء، لا يتغير حتى يعيد الأصل (parent) البناء. هذا يغطي معظم واجهة المستخدم في المشاريع الحقيقية.

قيود StatelessWidget

القيود الرئيسية لـ StatelessWidget هي عدم القدرة على تنفيذ عمليات غير متزامنة (طلبات HTTP، قراءة من قاعدة البيانات) مباشرة داخله. لمثل هذه السيناريوهات، نحتاج إلى StatefulWidget أو مزيج من StatelessWidget مع إدارة حالة خارجية (Riverpod، Bloc، Provider). لا يحتوي StatelessWidget على طرق دورة حياة، لذا فإن كود التهيئة والاشتراك وتحرير الموارد غير متاح فيه.

كيف يعمل StatelessWidget؟

تعتمد آلية عمل StatelessWidget على طريقة واحدة — build(BuildContext context). عندما يحتاج Flutter إلى عرض StatelessWidget، يستدعي الإطار هذه الطريقة، مررًا إليها BuildContext الحالي — موضع الـ widget في الشجرة. تُرجع الطريقة شجرة من الـ widgets الفرعية (أيضًا StatelessWidget أو StatefulWidget)، والتي يقوم Flutter بعد ذلك بتصييرها على الشاشة.

على عكس StatefulWidget، حيث يمكن استدعاء build عدة مرات استجابةً لـ setState، يتم استدعاء build لـ StatelessWidget فقط عندما يتم إدراج الـ widget لأول مرة في الشجرة أو عندما يغير الأصل معاملاته. يستخدم Flutter آلية المقارنة (reconciliation) لتحديد ما إذا كان الـ widget قد تغير منذ آخر استدعاء لـ build. إذا لم تتغير المعاملات (وتم تعريف الـ widget كـ const)، يتخطى Flutter إعادة البناء — هذه آلية تحسين رئيسية.

وفقًا لعرض فريق Flutter في Google I/O 2025 (Flutter Engineering Team، مايو 2025)، يمكن استبدال ما يصل إلى 60% من استدعاءات build في StatefulWidget بـ StatelessWidget إذا تم تنظيم الهندسة المعمارية بشكل صحيح. يوصي فريق Google برفع الحالة إلى الأعلى (State Hoisting) ونقل البيانات إلى الأسفل عبر المنشئات، مما يقلل عدد الـ widgets ذات الحالة.

الهيكل الداخلي لـ StatelessWidget

داخليًا، StatelessWidget هو فئة مجردة بطريقة مجردة واحدة build وطريقة ثابتة واحدة canUpdate، التي تتحقق مما إذا كان يمكن تحديث عنصر موجود بـ widget جديد من نفس النوع وبنفس key. إذا تطابقت runtimeType و key، يقوم Flutter بتحديث العنصر الموجود بدلاً من إنشاء عنصر جديد — هذا هو أساس التصيير الفعال.

ثبات StatelessWidget

الثبات (Immutability) هو خاصية رئيسية لـ StatelessWidget تميزه عن StatefulWidget. يجب تعريف جميع حقول StatelessWidget بالمُعدِّل final، ويتم تعيين القيم في المنشئ. بعد إنشاء النسخة، لا يمكن تغيير أي حقل — وهذا يضمن أن الـ widget يعرض دائمًا نفس البيانات التي تم تمريرها عند إنشائه.

يتبع هذا النهج نموذج البرمجة الوظيفية، حيث تُرجع الدالة دائمًا نفس النتيجة لنفس الوسائط. يستخدم Flutter الثبات لتحسين التصيير: إذا كان لنسختين من StatelessWidget نفس النوع ونفس المعاملات، يمكن للإطار تخزين نتيجة build مؤقتًا وعدم استدعائها مرة أخرى. عمليًا، هذا يعطي تحسنًا في الأداء يصل إلى 40% في القوائم التي تحتوي على العديد من العناصر المتشابهة.

الثبات يبسط أيضًا عملية التصحيح — يعرف المطور دائمًا ما هي البيانات التي يعرضها الـ widget بمجرد النظر إلى المنشئ الخاص به. لا يمكن تغيير الحالة من الداخل، لذلك تحدث جميع تغييرات الواجهة من خلال إعادة بناء الأصل بمعاملات جديدة.

قواعد الثبات للحقول

  • جميع الحقول — فقط final
  • المنشئ — ثابت (const)
  • لا تستخدم late final بدون تهيئة
  • لا تمرر كائنات قابلة للتغيير (مثل List بدون final)

أمثلة كود بلغة Dart

لنلقِ نظرة على مثال أساسي لـ StatelessWidget يعرض معلومات المستخدم. تقبل الفئة اسمًا وعمرًا عبر المنشئ وتُرجع widget مع نص وأنماط:

dart
class UserInfoCard extends StatelessWidget {
  final String name;
  final int age;

  const UserInfoCard({
    super.key,
    required this.name,
    required this.age,
  });

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Text('الاسم: $name', style: TextTheme.of(context).titleLarge),
            Text('العمر: $age', style: TextTheme.of(context).bodyMedium),
          ],
        ),
      ),
    );
  }
}

مثال على استخدام منشئ const لتحسين الأداء. إذا كان الـ widget الأصل يمرر نفس المعاملات في كل build، فإن const يسمح لـ Flutter بتخطي إعادة البناء بالكامل:

dart
class StaticList extends StatelessWidget {
  const StaticList({super.key});

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: const [
        ListTile(leading: Icon(Icons.star), title: Text('العنصر 1')),
        ListTile(leading: Icon(Icons.star), title: Text('العنصر 2')),
        ListTile(leading: Icon(Icons.star), title: Text('العنصر 3')),
      ],
    );
  }
}

في هذا المثال، جميع العناصر الفرعية ListTile و Icon و Text هي نسخ ثابتة. يقوم Flutter بإنشائها مرة واحدة ويعيد استخدامها في كل تحديث للأصل، مما يقلل بشكل كبير الحمل على جامع القمامة (garbage collector).

StatelessWidget مقابل StatefulWidget

الاختيار بين StatelessWidget و StatefulWidget هو قرار معماري أساسي عند التطوير بـ Flutter. الفرق الرئيسي يكمن في وجود الحالة: StatelessWidget لا يمكنه تغيير حالته، بينما StatefulWidget يمكنه ذلك. ومع ذلك، تتبع من ذلك اختلافات أعمق في دورة الحياة والأداء والهندسة المعمارية.

ينشئ StatefulWidget كائن State منفصلًا موجودًا طوال دورة حياة الـ widget. هذا يسمح بالتهيئة في initState، والاشتراك في تدفقات البيانات في didChangeDependencies، وتحرير الموارد في dispose. لا يوفر StatelessWidget أيًا من هذه الطرق — وجوده يبدأ وينتهي باستدعاء build.

الخاصيةStatelessWidgetStatefulWidget
الحالةلا يوجدنعم (عبر State)
استدعاءات buildمرة واحدة (أو عند تغيير الأصل)متعدد (setState + الأصل)
initStateلانعم
disposeلانعم
منشئ constموصى بهمحدود
الأداءعالٍأقل (بسبب State)

وفقًا لتحليل تطبيقات Flutter على Google Play (Flutter Team، سبتمبر 2025)، تُظهر المشاريع التي تسود فيها StatelessWidget وقتًا أقل بنسبة 20-25% للعرض الأول (First Paint) مقارنة بالمشاريع حيث معظم الـ widgets هي StatefulWidget. يُفسر ذلك بعدم وجود تكاليف إضافية لإنشاء وصيانة كائنات State.

متى تختار StatelessWidget

استخدم StatelessWidget إذا كان الـ widget يعرض فقط البيانات المستلمة من الأصل ولا يدير أي حالة داخلية. إذا كان الـ widget يحتاج إلى تنفيذ طلب HTTP أو معالجة إدخال المستخدم أو الاشتراك في تدفق — استخدم StatefulWidget أو انقل المنطق إلى طبقة إدارة حالة خارجية (Bloc، Riverpod).

تحسين الأداء

يعتمد تحسين StatelessWidget على ثلاثة مبادئ: المنشئات const، شجرة widgets مصغرة، والاستخدام الصحيح للمفاتيح. يسمح المنشئ const لـ Flutter بإنشاء الـ widget مرة واحدة في وقت الترجمة (compile-time) وإعادة استخدامه طوال عمر التطبيق. هذا يلغي الحاجة إلى استدعاءات build المتكررة ويقلل الحمل على موزع الذاكرة.

تصغير شجرة الـ widgets هو الجانب الثاني المهم. كل StatelessWidget متداخل يضيف مستوى واحدًا إلى شجرة العناصر. يجب على Flutter اجتياز الشجرة بأكملها في كل إطار، لذلك كلما كانت الشجرة أعمق، زاد العمل على الإطار. يُوصى بدمج الـ widgets البسيطة في StatelessWidget مخصص واحد عندما يحسن ذلك قابلية القراءة دون فقدان الأداء.

المفاتيح (Key) هي عنصر التحسين الثالث. عند إعادة بناء قائمة أو تغيير ترتيب العناصر، يسمح المفتاح الصحيح لـ Flutter بمطابقة العناصر القديمة والجديدة، متجنبًا إعادة إنشاء الـ widgets. بالنسبة لـ StatelessWidget، يكفي استخدام ValueKey أو ObjectKey بناءً على معرفات البيانات الفريدة.

const والأداء

استخدام const في منشئ StatelessWidget يعطي أكبر فائدة في الأداء عندما يُستخدم الـ widget بشكل متكرر في القوائم أو الهياكل المتكررة. يقارن Flutter الـ widget الجديد مع العنصر الموجود (Element)، وإذا تطابق النوع والمفتاح، يستدعي canUpdate. بالنسبة للـ widgets const ذات المعاملات المتطابقة، يتخطى Flutter استدعاء build بالكامل، مستخدمًا النتيجة المخزنة مؤقتًا.

الأخطاء الشائعة عند العمل

الخطأ الشائع الأول هو محاولة استخدام StatelessWidget حيث تكون التحديثات غير المتزامنة ضرورية. أحيانًا يضع المطورون طلب HTTP في منشئ StatelessWidget، متوقعين تحميل البيانات عند الإنشاء. عمليًا، يجب أن يكون المنشئ خفيفًا وبدون آثار جانبية. يجب تنفيذ العمليات غير المتزامنة في StatefulWidget.initState أو في الخدمات الخارجية.

الخطأ الشائع الثاني هو إنشاء عمليات حسابية ثقيلة داخل طريقة build. نظرًا لأنه يمكن استدعاء build بشكل متكرر (حتى في StatelessWidget — عند إعادة بناء الأصل)، فإن أي عمليات حسابية معقدة، أو استدعاءات MediaQuery.of(context) بدون تخزين مؤقت، أو إنشاء كائنات جديدة داخل build تقلل الأداء. الحل هو نقل الحسابات إلى طرق منفصلة مع التخزين المؤقت (memoization) أو استخدام مصانع const.

الخطأ الثالث هو غياب منشئ const في StatelessWidget يمكن أن يكون له واحد. إذا لم يُعلن الـ widget كـ const، فإن Flutter ينشئ نسخة جديدة في كل build للأصل، حتى لو لم تتغير المعاملات. هذا يؤدي إلى استهلاك مفرط للذاكرة وعمل إضافي لجامع القمامة.

كيف تتجنب الأخطاء في StatelessWidget

  • أعلن دائمًا المنشئ كـ const ما لم يكن هناك سبب لعدم القيام بذلك
  • لا تنفذ عمليات غير متزامنة داخل StatelessWidget
  • لا تنشئ كائنات جديدة داخل build — انقلها إلى حقول الفئة
  • استخدم Key للـ widgets في القوائم الديناميكية
  • تحقق مما إذا كان الـ widget يمكن أن يكون StatelessWidget قبل جعله StatefulWidget

الأسئلة الشائعة

ما الفرق بين StatelessWidget و StatefulWidget؟

StatelessWidget لا يمكنه تغيير حالته بعد الإنشاء — فهو يعرض فقط البيانات الممررة عبر المنشئ. StatefulWidget ينشئ كائن State منفصل يمكن أن يتغير عبر setState، وله طرق دورة حياة، ويسمح بتحديث واجهة المستخدم بشكل غير متزامن.

هل يمكن تحديث StatelessWidget؟

نعم، إذا كان الـ widget الأصل يعيد البناء ويمرر معاملات جديدة. StatelessWidget لا يُحدث نفسه بنفسه، لكن يمكن إعادة إنشائه بواسطة الأصل ببيانات جديدة. يقارن Flutter runtimeType و Key ليقرر ما إذا كان بحاجة لاستدعاء build مرة أخرى.

لماذا نحتاج إلى منشئ const في StatelessWidget؟

const يسمح لـ Flutter بإنشاء نسخة الـ widget في وقت الترجمة وتخزينها مؤقتًا. إذا كان لاثنين من الـ widgets const نفس المعاملات، يعيد Flutter استخدام عنصر واحد، متخطيًا استدعاء build بالكامل. هذا يعطي مكاسب في الأداء في القوائم والهياكل المتكررة.

ماذا يحدث إذا لم يكن لـ StatelessWidget منشئ const؟

سينشئ Flutter نسخة جديدة في كل build للأصل، حتى لو لم تتغير المعاملات. هذا يزيد الحمل على موزع الذاكرة وجامع القمامة، وقد يسبب أيضًا إعادة بناء غير ضرورية للـ widgets الفرعية.

كم عدد StatelessWidget الذي يمكن أن يكون في تطبيق واحد؟

لا توجد حدود. في تطبيق Flutter نموذجي، يشكل StatelessWidget 50–80% من جميع الـ widgets. كلما زاد عدد StatelessWidget، كان الأداء أكثر قابلية للتنبؤ والهندسة المعمارية أبسط. Flutter مُحسَّن للعمل بكفاءة مع آلاف StatelessWidget في شجرة واحدة.

الخلاصة

  • StatelessWidget — لبنة بناء أساسية في Flutter لعرض المحتوى الثابت، بدون حالة داخلية
  • build method — الطريقة المجردة الوحيدة في StatelessWidget، تُستدعى عند إدراج الـ widget في الشجرة أو عند تغيير الأصل للمعاملات
  • الثبات (Immutability) — جميع حقول StatelessWidget تُعلن كـ final ولا يمكن تغييرها بعد الإنشاء، مما يضمن عرضًا قابلًا للتنبؤ
  • منشئ const — آلية تحسين رئيسية تسمح لـ Flutter بتخزين الـ widget مؤقتًا وتخطي استدعاء build بالكامل عند تطابق المعاملات
  • الأداء — StatelessWidget ينشئ حملًا أقل مقارنةً بـ StatefulWidget، لأنه لا يتطلب كائن State وإدارة دورة الحياة
  • النسبة — يُوصى بالسعي إلى 50–80% من StatelessWidget في المشروع، مع نقل الحالة إلى طبقات خارجية (Riverpod، Bloc) ورفعها إلى أعلى الشجرة
  • قاعدة الاختيار — إذا كان الـ widget يمكن أن يكون StatelessWidget، فيجب أن يكون StatelessWidget. StatefulWidget — فقط عندما لا يمكن تجنب الحالة

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا