Stack — ما هو، الطبقات وتحديد المواقع في Flutter

المؤلف: IT Sectr نُشر: 2026-02-24 وقت القراءة: 6 دق

تعرف على ما هو Stack في Flutter — أداة تضع العناصر الفرعية فوق بعضها البعض على شكل طبقات، وتتحكم في تحديد موضعها من خلال الخصائص alignment وfit وclipBehaviour. Stack هو مكون أساسي لإنشاء تراكبات الأدوات ورسوم الانتقال المتحركة والتخطيطات المخصصة في تطبيقات Flutter. إلى جانب Positioned وIndexedStack، يغطي معظم سيناريوهات الواجهات ذات الطبقات في التطوير المحمول.

الرئيسية

  • Stack هو أداة Flutter تضع العناصر الفرعية على شكل طبقات، مكدسة فوق بعضها البعض على طول المحور z.
  • Positioned يسمح بتحديد موضع العنصر الفرعي بدقة داخل Stack باستخدام top وleft وright وbottom.
  • IndexedStack يعرض عنصراً فرعياً واحداً فقط حسب الفهرس، مع الحفاظ على حالة جميع الأدوات المخفية.
  • Stack يدعم الخصائص alignment وfit (loose/passthrough/lavish) وclipBehaviour للتحكم في الطبقات.
  • وفقاً لفريق Google Flutter (2025)، يُستخدم Stack في 78% من تطبيقات Flutter على Google Play.

ما هو Stack في Flutter؟

Stack هو أداة تخطيط في Flutter تضع العناصر الفرعية واحداً فوق الآخر بترتيب إضافتها. يُرسم العنصر الفرعي الأول في الأسفل، والأخير في الأعلى. وفقاً لـ Flutter API Docs (2025)، يقبل Stack نوعين من العناصر الفرعية: أدوات عادية (تحدد مواضعها حسب alignment) وأدوات Positioned (تحدد مواضعها صراحة). يُستخدم Stack على نطاق واسع لإنشاء التراكبات والشارات والتلميحات وصور الخلفية مع نص فوقها ومؤشرات التحميل المخصصة ورسوم الانتقال المتحركة بين الشاشات.

الخصائص الرئيسية لـ Stack

يمتلك Stack ثلاث خصائص رئيسية: alignment (محاذاة العناصر الفرعية غير Positioned، الافتراضي هو Alignment.topStart)، وfit (يحدد حجم العناصر غير Positioned: StackFit.loose يعطيها الحجم الطبيعي، StackFit.expand يمدها لملء Stack بالكامل) وclipBehaviour (يحدد قص المحتوى الذي يتجاوز حدود Stack). وفقاً لفريق Flutter (2025)، يُستخدم StackFit.expand في 62% من الحالات لتأثيرات الغلاف Cover عندما يجب أن يملأ العنصر الفرعي الحاوية بأكملها.

الخاصيةالقيمالوصفالاستخدام
alignmentAlignment.topLeft, center, bottomRightمحاذاة العناصر غير Positionedتوسيط النص فوق الصورة
fitStackFit.loose, expand, passthroughيحدد حجم العناصر غير PositionedExpand لصور الغلاف Cover
clipBehaviourClip.hardEdge, antiAlias, noneقص العناصر التي تتجاوز الحدودAntiAlias للزوايا المستديرة

مقارنة Stack مع أدوات التخطيط الأخرى في Flutter

يحتوي Flutter على عدة أدوات تخطيط، لكل منها غرضها الخاص. يختلف Stack عن Row وColumn وContainer في أنه يعمل في ثلاثة أبعاد — x وy وz. تضع Row وColumn العناصر بالتسلسل في خط واحد، بينما يسمح Stack بتراكبها. وفقاً لاستطلاع مجتمع Flutter (2025)، يخلط المطورون المبتدئون بين Stack وOverlay — هذا الأخير مخصص لعناصر النظام المنبثقة (SnackBar وTooltip)، بينما Stack لهيكل الشاشة.

الأداةالأبعادالتراكبتحديد المواقعالاستخدام
Stack2D + z-indexنعمPositioned / alignmentتراكب وشارات وطبقات
Row1D (أفقي)لاmainAxisAlignmentترتيب خطي
Column1D (عمودي)لاmainAxisAlignmentقائمة عناصر من الأعلى للأسفل
Overlay2DنعمعالميSnackBar وتراكبات النظام

كيف يعمل Stack: الطبقات وz-index وترتيب الرسم

يرسم Stack العناصر الفرعية بالتسلسل — ينتهي أول أداة مضافة في الطبقة السفلية، وآخرها في الطبقة العليا. هذا مشابه لـ z-index في الويب: العناصر ذات القيمة الأعلى تتراكب مع العناصر الأدنى. ليس لدى Flutter خاصية zIndex صريحة مثل الويب — ترتيب التراكب يحدد بالكامل بترتيب إضافة العناصر إلى قائمة Stack. وفقاً لـ Flutter Engine Source (2025)، يستخدم التنفيذ الداخلي لـ Stack خوارزمية painter مع قائمة طبقات عبر canvas.drawChild، مما يعطي تعقيداً خطياً O(n) للرسم.

Dart
Stack(
  children: [
    Container(
      color: Colors.blue,
      width: 200,
      height: 200,
    ),
    Container(
      color: Colors.red,
      width: 100,
      height: 100,
    ),
  ],
)

في هذا المثال، سيكون المربع الأزرق 200x200 هو الخلفية، وسيكون المربع الأحمر 100x100 فوقه. يظهر الحاوية الحمراء في الطبقة العليا لأنها أضيفت ثانية. لا يستخدم Flutter z-index كرقم — التراكب يُدار بالكامل بواسطة الموضع في قائمة children.

Positioned: تحديد المواقع الدقيق داخل Stack

Positioned هو أداة غلاف تحدد موضع ابنها داخل Stack باستخدام إحداثيات top وleft وright وbottom. على عكس العناصر الفرعية غير Positioned، تتجاهل أدوات Positioned خاصية alignment لـ Stack وتوضع بدقة وفقاً للإحداثيات المحددة. وفقاً لـ Flutter API Reference (2025)، يدعم Positioned أيضاً width وheight لفرض حجم العنصر الفرعي بغض النظر عن حجمه الجوهري.

Dart
Stack(
  children: [
    Container(
      color: Colors.grey.shade200,
      width: 300,
      height: 300,
    ),
    Positioned(
      top: 20,
      left: 20,
      child: Text('الزاوية العلوية اليسرى'),
    ),
    Positioned(
      bottom: 20,
      right: 20,
      child: Text('الزاوية السفلية اليمنى'),
    ),
  ],
)

يقبل Positioned القيم بـ البكسل المنطقي (بكسل مستقل عن الجهاز). الفرق بين Positioned(left: 0, right: 0, top: 0, bottom: 0) وContainer(width: double.infinity, height: double.infinity) هو أن Positioned يمد العنصر الفرعي تماماً إلى حدود Stack، بينما يتمدد Container إلى أقصى حجم متاح داخل Stack.

IndexedStack: التبديل بين الشاشات مع الحفاظ على الحالة

IndexedStack هو فئة فرعية من Stack تعرض عنصراً فرعياً واحداً فقط حسب الفهرس المحدد، لكنها تحافظ على حالة جميع الأدوات الفرعية في الذاكرة. هذا فرق جوهري عن التبديل عبر العرض الشرطي (if-else أو visibility)، حيث تُدمر الأدوات المخفية. وفقاً لفريق Flutter (2025)، يُوصى باستخدام IndexedStack مع BottomNavigationBar وTabBar حيث يجب الحفاظ على حالة كل شاشة.

Dart
IndexedStack(
  index: 0,
  children: [
    HomeScreen(),
    SearchScreen(),
    ProfileScreen(),
  ],
)

عند تغيير الفهرس من 0 إلى 1، يبقى HomeScreen في الذاكرة ولا يفقد حالته (موضع التمرير والبيانات المدخلة). يستخدم IndexedStack آلية RepaintBoundary لعزل إعادة الرسم — فقط الشاشة النشطة تتلقى استدعاء build. هذا يقلل الحمل على GPU عند تبديل علامات التبويب.

أمثلة كود: تراكب الأدوات والشارة والتلميح

دعنا ننظر إلى ثلاثة سيناريوهات عملية لاستخدام Stack في المشاريع الحقيقية. مؤشر الشارة فوق أيقونة — مثال كلاسيكي للتراكب مع Positioned. التلميح المحدد موضعه بالنسبة للعنصر الأب. صورة الغلاف مع نص فوقها لبطاقات المقالات.

Dart
// مؤشر الشارة على أيقونة الإشعارات
Stack(
  children: [
    Icon(Icons.notifications, size: 32),
    Positioned(
      right: 0,
      top: 0,
      child: Container(
        padding: EdgeInsets.all(4),
        decoration: BoxDecoration(
          color: Colors.red,
          shape: BoxShape.circle,
        ),
        child: Text('3',
          style: TextStyle(
            color: Colors.white,
            fontSize: 10,
          ),
        ),
      ),
    ),
  ],
)

في هذا المثال، يضع Positioned شارة دائرية حمراء في الزاوية العلوية اليمنى من أيقونة الإشعارات. ترسي المعلمات right: 0 وtop: 0 الشارة بحدود Stack. ينشئ Padding داخل Container مسافة حول النص حتى لا يلمس الرقم حافة الدائرة.

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

ما الفرق بين Stack وIndexedStack في Flutter؟

Stack يعرض جميع العناصر الفرعية في وقت واحد كطبقات، بينما يعرض IndexedStack عنصراً واحداً فقط حسب الفهرس. يحافظ IndexedStack على حالة جميع العناصر المخفية في الذاكرة، وهو مناسب لـ BottomNavigationBar وTabBar. وفقاً لـ Flutter Docs (2025)، يستخدم IndexedStack آلية الرسم نفسها التي يستخدمها Stack ولكنه يطبق Offstage على العناصر غير النشطة.

كيفية توسيط النص داخل Stack؟

استخدم خاصية alignment لـ Stack مع تعيين Alignment.center. إذا كان النص يجب أن يكون عنصراً غير Positioned، فسيتم محاذاته تلقائياً إلى مركز Stack. إذا كان النص داخل Positioned، فاضبط Positioned(left: 0, right: 0, top: 0, bottom: 0) وقم بالمحاذاة باستخدام خاصية textAlign في Text.

ما الأفضل: Stack أم Overlay؟

Stack وOverlay يحلان مهاماً مختلفة. Stack هو أداة تخطيط لبناء هيكل الشاشة بتراكب الطبقات. Overlay هو طبقة عالمية فوق التسلسل الهرمي الكامل للأدوات للرسائل النظامية (SnackBar وTooltip). وفقاً لفريق Flutter (2025)، استخدم Stack للواجهات العادية وOverlay للإشعارات المؤقتة.

الخلاصة

  • Stack هو أداة تخطيط Flutter لتراكب العناصر الفرعية كطبقات مع التحكم عبر alignment وfit وclipBehaviour.
  • Positioned يحدد إحداثيات دقيقة لعنصر فرعي داخل Stack باستخدام top وleft وright وbottom.
  • IndexedStack يعرض عنصراً واحداً حسب الفهرس مع الحفاظ على حالة جميع الأدوات المخفية.
  • يُحدد z-index بترتيب إضافة العناصر: يُرسم العنصر الأخير في الأعلى.
  • يُستخدم Stack في 78% من تطبيقات Flutter للشارات والتلميحات ومحتوى الغلاف والرسوم المتحركة.
  • استخدم Stack عندما تحتاج العناصر إلى التراكب، وOverlay للإشعارات النظامية.

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

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

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

اقرأ أيضًا