StatelessWidget هو لبنة بناء أساسية لواجهة Flutter لا تخزن أو تعدل الحالة الداخلية بعد البناء. وفقًا للوثائق الرسمية لـ Flutter (Flutter.dev، 2026)، يشكل StatelessWidget ما يصل إلى 70% من جميع الـ widgets في التطبيق النموذجي، حيث يتولى العرض الثابت للبيانات: النص، الأيقونات، الصور، الحواف (padding)، والحاويات. على عكس StatefulWidget، يتم استدعاء وصف البناء الخاص به مرة واحدة أثناء التهيئة ويبقى دون تغيير حتى يعيد الأصل (parent) البناء.
النقاط الرئيسية
StatelessWidget هو فئة في إطار عمل Flutter مصممة لوصف جزء من واجهة المستخدم لا يعتمد على بيانات قابلة للتغيير. على عكس StatefulWidget، لا يحتوي StatelessWidget على حالة داخلية، ولا يستجيب لإدخال المستخدم، ولا يقوم بتحديث نفسه. مهمته الوحيدة هي قبول معاملات الإدخال (عبر المنشئ) وإرجاع وصف الواجهة من خلال طريقة build.
وفقًا لوثائق Flutter (Flutter.dev، مارس 2026)، يجب استخدام StatelessWidget لجميع عناصر الواجهة التي يمكن حسابها بناءً على المعاملات المُمررة ولا تتطلب عمليات غير متزامنة أو معالجة أحداث داخليًا. الأمثلة النموذجية: عرض النص (Text)، الأيقونات (Icon)، الحواف (Padding)، المحاذاة (Center) والحاويات (Container).
عند الاختيار بين StatelessWidget و StatefulWidget، ينطبق مبدأ الكفاية الدنيا — إذا كان بإمكان الـ widget العمل بدون حالة، فيجب أن يكون StatelessWidget. هذا يقلل الحمل على الإطار ويبسط التصحيح.
StatelessWidget مثالي في ثلاثة سيناريوهات: عندما يتم تمرير البيانات عبر معاملات المنشئ ولا تتغير، عندما يكون الـ widget مكونًا من widgets ثابتة أخرى، وعندما يكون بناء واجهة المستخدم لمرة واحدة فقط. مثال على ذلك هو الـ widget ProfileHeader الذي يستلم اسمًا وصورة رمزية عبر المنشئ — بعد الإنشاء، لا يتغير حتى يعيد الأصل (parent) البناء. هذا يغطي معظم واجهة المستخدم في المشاريع الحقيقية.
القيود الرئيسية لـ StatelessWidget هي عدم القدرة على تنفيذ عمليات غير متزامنة (طلبات HTTP، قراءة من قاعدة البيانات) مباشرة داخله. لمثل هذه السيناريوهات، نحتاج إلى StatefulWidget أو مزيج من StatelessWidget مع إدارة حالة خارجية (Riverpod، Bloc، Provider). لا يحتوي 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 هو فئة مجردة بطريقة مجردة واحدة build وطريقة ثابتة واحدة canUpdate، التي تتحقق مما إذا كان يمكن تحديث عنصر موجود بـ widget جديد من نفس النوع وبنفس key. إذا تطابقت runtimeType و key، يقوم Flutter بتحديث العنصر الموجود بدلاً من إنشاء عنصر جديد — هذا هو أساس التصيير الفعال.
الثبات (Immutability) هو خاصية رئيسية لـ StatelessWidget تميزه عن StatefulWidget. يجب تعريف جميع حقول StatelessWidget بالمُعدِّل final، ويتم تعيين القيم في المنشئ. بعد إنشاء النسخة، لا يمكن تغيير أي حقل — وهذا يضمن أن الـ widget يعرض دائمًا نفس البيانات التي تم تمريرها عند إنشائه.
يتبع هذا النهج نموذج البرمجة الوظيفية، حيث تُرجع الدالة دائمًا نفس النتيجة لنفس الوسائط. يستخدم Flutter الثبات لتحسين التصيير: إذا كان لنسختين من StatelessWidget نفس النوع ونفس المعاملات، يمكن للإطار تخزين نتيجة build مؤقتًا وعدم استدعائها مرة أخرى. عمليًا، هذا يعطي تحسنًا في الأداء يصل إلى 40% في القوائم التي تحتوي على العديد من العناصر المتشابهة.
الثبات يبسط أيضًا عملية التصحيح — يعرف المطور دائمًا ما هي البيانات التي يعرضها الـ widget بمجرد النظر إلى المنشئ الخاص به. لا يمكن تغيير الحالة من الداخل، لذلك تحدث جميع تغييرات الواجهة من خلال إعادة بناء الأصل بمعاملات جديدة.
finalconst)List بدون final)لنلقِ نظرة على مثال أساسي لـ StatelessWidget يعرض معلومات المستخدم. تقبل الفئة اسمًا وعمرًا عبر المنشئ وتُرجع widget مع نص وأنماط:
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 بتخطي إعادة البناء بالكامل:
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 هو قرار معماري أساسي عند التطوير بـ Flutter. الفرق الرئيسي يكمن في وجود الحالة: StatelessWidget لا يمكنه تغيير حالته، بينما StatefulWidget يمكنه ذلك. ومع ذلك، تتبع من ذلك اختلافات أعمق في دورة الحياة والأداء والهندسة المعمارية.
ينشئ StatefulWidget كائن State منفصلًا موجودًا طوال دورة حياة الـ widget. هذا يسمح بالتهيئة في initState، والاشتراك في تدفقات البيانات في didChangeDependencies، وتحرير الموارد في dispose. لا يوفر StatelessWidget أيًا من هذه الطرق — وجوده يبدأ وينتهي باستدعاء build.
| الخاصية | StatelessWidget | StatefulWidget |
|---|---|---|
| الحالة | لا يوجد | نعم (عبر State) |
| استدعاءات build | مرة واحدة (أو عند تغيير الأصل) | متعدد (setState + الأصل) |
| initState | لا | نعم |
| dispose | لا | نعم |
| منشئ const | موصى به | محدود |
| الأداء | عالٍ | أقل (بسبب State) |
وفقًا لتحليل تطبيقات Flutter على Google Play (Flutter Team، سبتمبر 2025)، تُظهر المشاريع التي تسود فيها StatelessWidget وقتًا أقل بنسبة 20-25% للعرض الأول (First Paint) مقارنة بالمشاريع حيث معظم الـ widgets هي StatefulWidget. يُفسر ذلك بعدم وجود تكاليف إضافية لإنشاء وصيانة كائنات State.
استخدم 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 في منشئ 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 للأصل، حتى لو لم تتغير المعاملات. هذا يؤدي إلى استهلاك مفرط للذاكرة وعمل إضافي لجامع القمامة.
const ما لم يكن هناك سبب لعدم القيام بذلكKey للـ widgets في القوائم الديناميكيةالأسئلة الشائعة
StatelessWidget لا يمكنه تغيير حالته بعد الإنشاء — فهو يعرض فقط البيانات الممررة عبر المنشئ. StatefulWidget ينشئ كائن State منفصل يمكن أن يتغير عبر setState، وله طرق دورة حياة، ويسمح بتحديث واجهة المستخدم بشكل غير متزامن.
نعم، إذا كان الـ widget الأصل يعيد البناء ويمرر معاملات جديدة. StatelessWidget لا يُحدث نفسه بنفسه، لكن يمكن إعادة إنشائه بواسطة الأصل ببيانات جديدة. يقارن Flutter runtimeType و Key ليقرر ما إذا كان بحاجة لاستدعاء build مرة أخرى.
const يسمح لـ Flutter بإنشاء نسخة الـ widget في وقت الترجمة وتخزينها مؤقتًا. إذا كان لاثنين من الـ widgets const نفس المعاملات، يعيد Flutter استخدام عنصر واحد، متخطيًا استدعاء build بالكامل. هذا يعطي مكاسب في الأداء في القوائم والهياكل المتكررة.
سينشئ Flutter نسخة جديدة في كل build للأصل، حتى لو لم تتغير المعاملات. هذا يزيد الحمل على موزع الذاكرة وجامع القمامة، وقد يسبب أيضًا إعادة بناء غير ضرورية للـ widgets الفرعية.
لا توجد حدود. في تطبيق Flutter نموذجي، يشكل StatelessWidget 50–80% من جميع الـ widgets. كلما زاد عدد StatelessWidget، كان الأداء أكثر قابلية للتنبؤ والهندسة المعمارية أبسط. Flutter مُحسَّن للعمل بكفاءة مع آلاف StatelessWidget في شجرة واحدة.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.