Stack — bu nədir, Flutter-də təbəqələr və yerləşdirmə

Müəllif: IT Sectr Dərc olunub: 2026-02-24 Oxuma vaxtı: 6 dəq

Flutter-də Stack-in nə olduğunu öyrənin — uşaq elementləri bir-birinin üstünə təbəqələr şəklində yerləşdirən, onların mövqeyini alignment, fit və clipBehaviour xüsusiyyətləri ilə idarə edən vidjet. Stack, Flutter tətbiqlərində vidjetlərin üst-üstə yerləşdirilməsi, keçid animasiyaları və fərdi maketlər yaratmaq üçün əsas komponentdir. Positioned və IndexedStack ilə birlikdə mobil inkişafda təbəqəli interfeyslərin əksər ssenarilərini əhatə edir.

Əsas məqamlar

  • Stack — uşaq elementlərini z-oxu boyunca bir-birinin üstünə yerləşdirən Flutter vidjeti.
  • Positioned, Stack daxilində uşaq elementinin mövqeyini top, left, right, bottom ilə dəqiq təyin etməyə imkan verir.
  • IndexedStack indeks üzrə yalnız bir uşaq elementi göstərir, lakin bütün gizli vidjetlərin vəziyyətini saxlayır.
  • Stack alignment, fit (loose/passthrough/lavish) və clipBehaviour xüsusiyyətlərini dəstəkləyir.
  • Google Flutter Team (2025) məlumatına görə, Stack Google Play-dəki Flutter tətbiqlərinin 78%-də istifadə olunur.

Flutter-də Stack nədir?

Stack — uşaq elementlərini əlavə olunma ardıcıllığı ilə bir-birinin üstünə yerləşdirən Flutter düzüm vidjetidir. Birinci uşaq element aşağıda, sonuncu isə yuxarıda çəkilir. Flutter API Docs (2025) məlumatına görə, Stack iki növ uşaq element qəbul edir: adi vidjetlər (alignment-ə uyğun yerləşdirilir) və Positioned vidjetləri (açıq şəkildə yerləşdirilir). Stack üst-üstə düşmələr, nişanlar, ipucları, üzərində mətn olan fon şəkilləri, fərdi yükləmə göstəriciləri və ekranlar arasında keçid animasiyaları yaratmaq üçün geniş istifadə olunur.

Stack-in əsas xüsusiyyətləri

Stack-in üç əsas xüsusiyyəti var: alignment (Positioned olmayan uşaq elementlərinin düzləndirilməsi, standart olaraq Alignment.topStart), fit (Positioned olmayan elementlərin ölçüsünü müəyyən edir: StackFit.loose təbii ölçü verir, StackFit.expand bütün Stack-ə qədər uzadır) və clipBehaviour (Stack-in sərhədlərindən kənara çıxan məzmunun kəsilməsini təyin edir). Flutter Team (2025) məlumatına görə, StackFit.expand 62% hallarda Cover effektləri üçün istifadə olunur, uşaq vidjet bütün konteyneri doldurmalı olduqda.

XüsusiyyətDəyərlərİzahTətbiq
alignmentAlignment.topLeft, center, bottomRightPositioned olmayan uşaqların düzləndirilməsiMətnin şəklin üzərində mərkəzləşdirilməsi
fitStackFit.loose, expand, passthroughPositioned olmayan uşaqların ölçüsünü təyin edirCover şəkilləri üçün Expand
clipBehaviourClip.hardEdge, antiAlias, noneSərhədlərdən kənara çıxan elementlərin kəsilməsiDairəvi künclər üçün AntiAlias

Stack-in Flutter-in digər düzüm vidjetləri ilə müqayisəsi

Flutter-də hər biri öz məqsədi olan bir neçə düzüm vidjeti mövcuddur. Stack Row, Column və Container-dən onunla fərqlənir ki, üç ölçüdə — x, y və z üzrə işləyir. Row və Column elementləri ardıcıl olaraq bir xəttə yerləşdirir, Stack isə onları üst-üstə yerləşdirməyə imkan verir. Flutter Community (2025) sorğusuna görə, yeni başlayan tərtibatçılar Stack və Overlay-i qarışdırırlar — sonuncu sistem açılan elementləri (SnackBar, Tooltip) üçün nəzərdə tutulub, Stack isə ekran strukturu üçündür.

VidjetÖlçülərÜst-üstə düşməYerləşdirməİstifadə
Stack2D + z-indexBəliPositioned / alignmentÜst-üstə yerləşdirmə, nişanlar, təbəqələr
Row1D (üfüqi)XeyrmainAxisAlignmentXətti düzülüş
Column1D (şaquli)XeyrmainAxisAlignmentElementlərin yuxarıdan aşağıya siyahısı
Overlay2DBəliQlobalSnackBar, sistem örtükləri

Stack necə işləyir: təbəqələr, z-index və çəkmə ardıcıllığı

Stack uşaq elementləri ardıcıl çəkir — birinci əlavə olunan vidjet aşağı təbəqədə, sonuncu isə yuxarı təbəqədə yerləşir. Bu, vebdəki z-index-in analoqudur: daha yüksək dəyəri olan elementlər aşağıdakıları örtür. Flutter-də vebdəki kimi aşkar zIndex xüsusiyyəti yoxdur — örtmə ardıcıllığı tamamilə uşaqların Stack-in children siyahısına əlavə olunma ardıcıllığı ilə müəyyən edilir. Flutter Engine Source (2025) məlumatına görə, Stack-in daxili reallaşdırması canvas.drawChild vasitəsilə təbəqə növbəsi olan rəssam alqoritmindən istifadə edir ki, bu da çəkmə zamanı O(n) xətti mürəkkəblik verir.

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

Bu nümunədə 200×200 mavi kvadrat fon olacaq, 100×100 qırmızı kvadrat isə onun üzərində olacaq. Qırmızı konteyner ikinci əlavə olunduğu üçün yuxarı təbəqədə görünəcək. Flutter z-index-i rəqəm kimi istifadə etmir — örtmə tamamilə children siyahısındakı mövqe ilə idarə olunur.

Positioned: Stack daxilində dəqiq yerləşdirmə

Positioned — uşağını Stack daxilində top, left, right, bottom koordinatları ilə yerləşdirən sarma vidjetidir. Positioned olmayan uşaq elementlərindən fərqli olaraq, Positioned vidjetləri Stack-in alignment xüsusiyyətini görməzliyə vurur və verilən koordinatlara uyğun yerləşdirilir. Flutter API Reference (2025) məlumatına görə, Positioned həmçinin uşaq elementin ölçüsünü onun intrinsic size-indən asılı olmayaraq məcburi təyin etmək üçün width və height-i dəstəkləyir.

Dart
Stack(
  children: [
    Container(
      color: Colors.grey.shade200,
      width: 300,
      height: 300,
    ),
    Positioned(
      top: 20,
      left: 20,
      child: Text('Yuxarı sol künc'),
    ),
    Positioned(
      bottom: 20,
      right: 20,
      child: Text('Aşağı sağ künc'),
    ),
  ],
)

Positioned dəyərləri məntiqi piksellərdə (device-independent pixels) qəbul edir. Positioned(left: 0, right: 0, top: 0, bottom: 0) və Container(width: double.infinity, height: double.infinity) arasındakı fərq — Positioned uşaq elementi dəqiq Stack-in sərhədlərinə qədər uzadır, Container isə Stack daxilində maksimum mövcud ölçüyə qədər.

IndexedStack: vəziyyəti saxlamaqla ekranlar arasında keçid

IndexedStack — Stack-in alt sinfi olub, yalnız göstərilən indeks üzrə bir uşaq elementi göstərir, lakin bütün uşaq vidjetlərin vəziyyətini yaddaşda saxlayır. Bu, şərti render (if-else və ya visibility) vasitəsilə keçiddən prinsipial fərqdir — gizli vidjetlər məhv edilmir. Flutter Team (2025) məlumatına görə, IndexedStack BottomNavigationBar və TabBar üçün tövsiyə olunur, burada hər ekranın vəziyyətini saxlamaq lazımdır.

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

Index 0-dan 1-ə keçirildikdə HomeScreen yaddaşda qalır və öz vəziyyətini itirmir (sürüşdürmə, daxil edilmiş məlumatlar). IndexedStack yenidən çəkməni izolyasiya etmək üçün RepaintBoundary mexanizmindən istifadə edir — yalnız aktiv ekran build çağırışını alır. Bu, tabların dəyişdirilməsi zamanı GPU yükünü azaldır.

Kod nümunələri: vidjetlərin üst-üstə yerləşdirilməsi, nişan, ipucu

Real layihələrdə Stack-in istifadəsinin üç praktik ssenarisini nəzərdən keçirək. İkon üzərində bildiriş nişanı — Positioned ilə üst-üstə yerləşdirmənin klassik nümunəsi. Valideyn elementə nisbətən yerləşdirilən ipucu. Məqalə kartları üçün üzərində mətn olan Cover şəkli.

Dart
// Bildiriş ikonasında nişan göstəricisi
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,
          ),
        ),
      ),
    ),
  ],
)

Bu nümunədə Positioned bildiriş ikonasının yuxarı sağ küncündə qırmızı dairə-nişan yerləşdirir. right: 0 və top: 0 parametrləri nişanı Stack-in sərhədlərinə bağlayır. Container daxilindəki Padding rəqəmin dairənin kənarına yapışmaması üçün mətn ətrafında boşluq yaradır.

Tez-tez verilən suallar

Flutter-də Stack və IndexedStack arasında fərq nədir?

Stack bütün uşaq elementlərini eyni anda təbəqələr şəklində göstərir, IndexedStack isə indeks üzrə yalnız birini göstərir. IndexedStack bütün gizli uşaqların vəziyyətini yaddaşda saxlayır ki, bu da BottomNavigationBar və TabBar üçün əlverişlidir. Flutter Docs (2025) məlumatına görə, IndexedStack Stack ilə eyni çəkmə mexanizmindən istifadə edir, lakin qeyri-aktiv uşaqlara Offstage tətbiq edir.

Stack daxilində mətni necə mərkəzləşdirmək olar?

Stack-in alignment xüsusiyyətindən istifadə edin, Alignment.center təyin edin. Əgər mətn Positioned olmayan uşaq elementidirsə, avtomatik olaraq Stack-in mərkəzində düzləşəcək. Əgər mətn Positioned daxilindədirsə, Positioned(left: 0, right: 0, top: 0, bottom: 0) təyin edin və düzləndirməni Text-in textAlign xüsusiyyəti ilə edin.

Hansı daha yaxşıdır: Stack yoxsa Overlay?

Stack və Overlay fərqli vəzifələri həll edir. Stack təbəqələrin üst-üstə yerləşdirilməsi ilə ekran strukturunu qurmaq üçün düzüm vidjetidir. Overlay — sistem mesajları (SnackBar, Tooltip) üçün vidjet iyerarxiyasının üstündə qlobal təbəqədir. Flutter Team (2025) məlumatına görə, adi interfeyslər üçün Stack, müvəqqəti bildirişlər üçün Overlay istifadə edin.

Nəticə

  • Stack — uşaq elementlərini alignment, fit və clipBehaviour ilə idarə olunan təbəqələr şəklində yerləşdirmək üçün Flutter düzüm vidjeti.
  • Positioned uşaq elementin Stack daxilində dəqiq koordinatlarını top, left, right, bottom ilə təyin edir.
  • IndexedStack indeks üzrə bir element göstərir, bütün gizli vidjetlərin vəziyyətini saxlayır.
  • Z-index uşaqların əlavə olunma ardıcıllığı ilə müəyyən edilir: sonuncu element üstdə çəkilir.
  • Stack nişanlar, ipucları, Cover məzmunu və animasiyalar üçün Flutter tətbiqlərinin 78%-də istifadə olunur.
  • Elementlərin üst-üstə yerləşdirilməsi lazım olduqda Stack, sistem bildirişləri üçün Overlay istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun