Stack — mi ez, rétegek és pozícionálás Flutterben

Szerző: IT Sectr Megjelenés: 2026-02-24 Olvasási idő: 6 perc

Ismerje meg, mi a Stack a Flutterben — widget, amely a gyermekelemeket rétegek formájában egymásra helyezi, pozícionálásukat az alignment, fit és clipBehaviour tulajdonságokkal vezérelve. A Stack kulcsfontosságú komponens widgetek egymásra helyezéséhez, átmeneti animációkhoz és egyéni elrendezésekhez Flutter alkalmazásokban. A Positioned és IndexedStack mellett a legtöbb réteges felületi forgatókönyvet lefedi a mobilfejlesztésben.

Főbb pontok

  • Stack — Flutter widget, amely a gyermekelemeket rétegek formájában a z-tengely mentén egymásra helyezi.
  • A Positioned lehetővé teszi a gyermekelem pontos pozíciójának beállítását a Stacken belül a top, left, right, bottom segítségével.
  • Az IndexedStack csak egy gyermekelem jelenít meg index szerint, megtartva az összes rejtett widget állapotát.
  • A Stack támogatja az alignment, fit (loose/passthrough/lavish) és clipBehaviour tulajdonságokat a rétegek vezérléséhez.
  • A Google Flutter Team (2025) adatai szerint a Stack a Google Playen található Flutter alkalmazások 78%-ában használatos.

Mi a Stack a Flutterben?

Stack egy Flutter elrendezési widget, amely a gyermekelemeket hozzáadásuk sorrendjében egymásra helyezi. Az első gyermekelem alul, az utolsó felül rajzolódik ki. A Flutter API Docs (2025) szerint a Stack kétféle gyermekelemtípust fogad el: közönséges widgeteket (az alignment szerint pozícionálva) és Positioned widgeteket (kifejezetten pozícionálva). A Stack széles körben használatos fedések, jelvények, tippek, háttérképek szöveggel, egyéni betöltésjelzők és képernyők közötti átmeneti animációk készítéséhez.

A Stack fő tulajdonságai

A Stack három kulcsfontosságú tulajdonsággal rendelkezik: alignment (a nem-Positioned gyermekelemek igazítása, alapértelmezés szerint Alignment.topStart), fit (meghatározza a nem-Positioned elemek méretét: a StackFit.loose természetes méretet ad, a StackFit.expand az egész Stackre kinyújtja) és clipBehaviour (meghatározza a Stack határain túlnyúló tartalom levágását). A Flutter Team (2025) szerint a StackFit.expand az esetek 62%-ában Cover effektusokhoz használatos, amikor a gyermek widgetnek ki kell töltenie az egész konténert.

TulajdonságÉrtékekLeírásAlkalmazás
alignmentAlignment.topLeft, center, bottomRightA nem-Positioned gyermekek igazításaSzöveg középre igazítása kép fölött
fitStackFit.loose, expand, passthroughMeghatározza a nem-Positioned gyermekek méretétExpand Cover képekhez
clipBehaviourClip.hardEdge, antiAlias, noneA határokon túlnyúló elemek levágásaAntiAlias lekerekített sarkokhoz

Stack összehasonlítása más Flutter elrendezési widgetekkel

A Flutterben több elrendezési widget létezik, mindegyiknek saját célja van. A Stack abban különbözik a Row, Column és Container widgetektől, hogy három dimenzióban — x, y és z — működik. A Row és Column egymás után egy vonalba helyezi az elemeket, míg a Stack lehetővé teszi egymásra helyezésüket. A Flutter Community (2025) felmérése szerint a kezdő fejlesztők összetévesztik a Stacket az Overlayjel — utóbbi a rendszer felugró elemeihez (SnackBar, Tooltip) készült, a Stack pedig a képernyő szerkezetéhez.

WidgetDimenziókEgymásra helyezésPozícionálásHasználat
Stack2D + z-indexIgenPositioned / alignmentEgymásra helyezés, jelvény, rétegek
Row1D (vízszintes)NemmainAxisAlignmentLineáris elrendezés
Column1D (függőleges)NemmainAxisAlignmentElemek listája fentről lefelé
Overlay2DIgenGlobálisSnackBar, rendszerfedések

Hogyan működik a Stack: rétegek, z-index és rajzolási sorrend

Stack a gyermekelemeket egymás után rajzolja — az első hozzáadott widget az alsó rétegen, az utolsó a felső rétegen található. Ez a webes z-index analógiája: a magasabb értékkel rendelkező elemek lefedik az alacsonyabbakat. A Flutterben nincs explicit zIndex tulajdonság, mint a weben — a fedési sorrendet teljes mértékben a gyermekek Stack listájához való hozzáadásának sorrendje határozza meg. A Flutter Engine Source (2025) szerint a Stack belső implementációja egy festő algoritmust használ rétegsorral a canvas.drawChild segítségével, ami lineáris O(n) komplexitást biztosít a rajzolás során.

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

Ebben a példában a 200×200-as kék négyzet lesz a háttér, a 100×100-as piros négyzet pedig fölötte. A piros konténer a felső rétegen jelenik meg, mivel másodikként lett hozzáadva. A Flutter nem használja a z-indexet számként — a fedést teljes mértékben a children listában elfoglalt pozíció vezérli.

Positioned: pontos pozícionálás a Stacken belül

Positioned egy burkoló widget, amely a gyermekét a Stacken belül a top, left, right, bottom koordináták segítségével pozícionálja. A nem-Positioned gyermekelemekkel ellentétben a Positioned widgetek figyelmen kívül hagyják a Stack alignment tulajdonságát, és szigorúan a megadott koordináták szerint helyezkednek el. A Flutter API Reference (2025) szerint a Positioned támogatja a width és height tulajdonságokat is a gyermekelem méretének kényszerítésére, függetlenül annak belső méretétől.

Dart
Stack(
  children: [
    Container(
      color: Colors.grey.shade200,
      width: 300,
      height: 300,
    ),
    Positioned(
      top: 20,
      left: 20,
      child: Text('Bal felső sarok'),
    ),
    Positioned(
      bottom: 20,
      right: 20,
      child: Text('Jobb alsó sarok'),
    ),
  ],
)

A Positioned az értékeket logikai pixelekben (device-independent pixels) fogadja. A különbség a Positioned(left: 0, right: 0, top: 0, bottom: 0) és a Container(width: double.infinity, height: double.infinity) között — a Positioned pontosan a Stack határáig nyújtja a gyermekelemet, míg a Container a Stacken belüli maximálisan elérhető méretig.

IndexedStack: váltás képernyők között az állapot megtartásával

IndexedStack a Stack egy alosztálya, amely csak egy gyermekelemet jelenít meg a megadott index szerint, de az összes gyermek widget állapotát a memóriában tartja. Ez alapvető különbség a feltételes megjelenítéssel (if-else vagy visibility) történő váltáshoz képest, ahol a rejtett widgetek megsemmisülnek. A Flutter Team (2025) szerint az IndexedStack ajánlott BottomNavigationBar és TabBar esetén, ahol meg kell őrizni az egyes képernyők állapotát.

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

Az index 0-ról 1-re váltásakor a HomeScreen a memóriában marad, és nem veszíti el állapotát (görgetés, bevitt adatok). Az IndexedStack a RepaintBoundary mechanizmust használja az újrarajzolás elkülönítésére — csak az aktív képernyő kap build hívást. Ez csökkenti a GPU terhelését a lapok közötti váltáskor.

Kódpéldák: widgetek egymásra helyezése, jelvény, tipp

Vizsgáljuk meg a Stack használatának három gyakorlati forgatókönyvét valós projektekben. Értesítési jelvény az ikon fölött — klasszikus példa az egymásra helyezésre Positioned segítségével. Tipp a szülőelemhez viszonyított pozícionálással. Cover kép szöveggel a tetején cikkek kártyáihoz.

Dart
// Jelvényjelző az értesítési ikonon
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,
          ),
        ),
      ),
    ),
  ],
)

Ebben a példában a Positioned egy piros kör jelvényt helyez el az értesítési ikon jobb felső sarkában. A right: 0 és top: 0 paraméterek a Stack határaihoz rögzítik a jelvényt. A Containeren belüli Padding helyet hoz létre a szöveg körül, hogy a szám ne érjen hozzá a kör széléhez.

Gyakran Ismételt Kérdések

Mi a különbség a Stack és az IndexedStack között a Flutterben?

A Stack az összes gyermekelemet egyszerre, rétegek formájában jeleníti meg, míg az IndexedStream csak egyet mutat index szerint. Az IndexedStack az összes rejtett gyermek állapotát a memóriában tartja, ami kényelmes a BottomNavigationBar és TabBar számára. A Flutter Docs (2025) szerint az IndexedStack ugyanazt a rajzolási mechanizmust használja, mint a Stack, de az inaktív gyermekekre Offstage alkalmaz.

Hogyan lehet középre igazítani a szöveget a Stacken belül?

Használja a Stack alignment tulajdonságát, állítsa be Alignment.center értékre. Ha a szöveg nem-Positioned gyermekelem, automatikusan középre igazodik a Stackben. Ha a szöveg Positioneden belül van, állítsa be a Positioned(left: 0, right: 0, top: 0, bottom: 0) paramétert, és az igazítást a Text textAlign tulajdonságán keresztül végezze.

Melyik jobb: Stack vagy Overlay?

A Stack és az Overlay különböző feladatokat old meg. A Stack egy elrendezési widget a képernyő szerkezetének felépítéséhez rétegek egymásra helyezésével. Az Overlay egy globális réteg a teljes widget hierarchia fölött rendszerüzenetekhez (SnackBar, Tooltip). A Flutter Team (2025) szerint szokásos felületekhez használja a Stacket, ideiglenes értesítésekhez az Overlayt.

Összefoglalás

  • Stack — Flutter elrendezési widget gyermekelemek rétegek formájában történő egymásra helyezéséhez, alignment, fit és clipBehaviour vezérléssel.
  • A Positioned beállítja a gyermekelem pontos koordinátáit a Stacken belül top, left, right, bottom szerint.
  • Az IndexedStack egy elemet mutat index szerint, megtartva az összes rejtett widget állapotát.
  • A z-indexet a gyermekek hozzáadásának sorrendje határozza meg: az utolsó elem rajzolódik felül.
  • A Stack a Flutter alkalmazások 78%-ában használatos jelvényekhez, tippekhez, Cover tartalmakhoz és animációkhoz.
  • Használja a Stacket elemek egymásra helyezéséhez, az Overlayt rendszerértesítésekhez.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is