Expanded: mi ez, működési elve a Flutterben

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

Expanded egy Flutter widget, amely arra kényszeríti a gyermekelemet, hogy kitöltse az összes rendelkezésre álló helyet egy Flex tárolóban. Amikor a Row vagy Column elosztja a helyet a gyermekek között, az Expanded a rugalmatlan elemek figyelembevétele után elveszi a szabad helyet. A Flutter hivatalos dokumentációja (2026) szerint az Expanded az egyik leggyakrabban használt layout widget: interfészek százalékos beállításánál, kártyák, listák és panelek építésénél alkalmazzák. Fő előnye a szélesség vagy magasság automatikus kiszámítása a flex együttható alapján, anélkül hogy explicit módon meg kellene adni a méreteket.

Főbb pontok

  • Expanded — layout widget, amely a gyermeket az összes szabad helyre kinyújtja Row, Column vagy Flex esetén
  • Flex faktor határozza meg, hogy az egyes Expanded mekkora részt kap a szabad helyből
  • Expanded abban különbözik a Flexible-től, hogy kényszerítően kitölti az összes rendelkezésre álló helyet
  • Stack nem támogatja az Expanded-et, csak Row, Column és Flex
  • Hiba az Expanded Flex tárolón kívüli használata LayoutException-t okoz

Mi az Expanded

Expanded egy burkoló widget, amely elfogad egy child-ot, és arra kényszeríti, hogy táguljon ki a rendelkezésre álló hely kitöltéséhez egy Flex tárolóban (Row, Column, Flex). Az Expanded-nek nincs saját vizuális megjelenítése — csak a gyermek elemnek továbbított korlátozásokat kezeli.

Az Expanded alapjául a Flutter keretrendszer által biztosított Flex mechanizmus szolgál. Amikor a Row vagy Column kiszámítja a gyermekek méreteit, először helyet allokál a rugalmatlan elemeknek (rögzített méretű szokásos widgetek), a fennmaradó helyet pedig az Expanded és Flexible gyermekek között osztja el arányosan a flex faktoraik alapján.

Az Expanded Flexible.fit = FlexFit.tight értéket használ. Ez azt jelenti, hogy az Expanded gyermekének el kell foglalnia az összes allokált helyet, még akkor is, ha a saját mérete kisebb. Ellentétben a Fit.loose értékkel rendelkező Flexible-lel, ahol a gyermek kisebb lehet az allokált területnél, az Expanded kényszerítően kinyújtja a tartalmat.

Következtetés: az Expanded a fő eszköz arányos elrendezések létrehozásához a Flutterben. Akkor használja, ha azt szeretné, hogy egy elem garantáltan elfoglalja az összes rendelkezésre álló szélességet vagy magasságot.

Expanded vs Flexible: fő különbségek

Expanded és Flexible — mindkettő helyet oszt el Flex tárolókban, de alapvetően eltérően viselkednek. A különbség a fit tulajdonságban van, amely meghatározza, hogy a gyermek lehet-e kisebb a rendelkezésre álló helynél.

Az Expanded merev viselkedési modellel rendelkezik: a fit értéke FlexFit.tight. Ez azt jelenti, hogy a gyermek widget a rendelkezésre álló hellyel egyenlő korlátozásokat kap — se többet, se kevesebbet. Ha a gyermek kisebb, kinyújtásra kerül. Ha nagyobb — összenyomásra kerül. A Flexible FlexFit.loose értéket használ, lehetővé téve a gyermek elem számára, hogy bármilyen méretű legyen az allokált hely határain belül.

A gyakorlatban: ha egy Row-ban két Expanded van flex=1 értékkel, mindegyik pontosan a szélesség felét foglalja el. Ha kicseréli őket Flexible-re fit.loose értékkel, minden gyermek lehet kisebb a felénél, ha a saját mérete kisebb — a fennmaradó hely üresen marad.

Következtetés: használja az Expanded-et szigorú arányos elrendezésekhez, a Flexible-t — amikor a gyermek lehet kisebb a rendelkezésre álló helynél. Ha nem biztos — kezdje az Expanded-del, kiszámíthatóbb viselkedést nyújt.

Flex faktor: hogyan oszlik el a hely

Flex faktor (flex paraméter) — egy numerikus érték, amely meghatározza a rendelkezésre álló hely azon részét, amelyet az Expanded kap. Alapértelmezés szerint flex=1, ami egyenlő elosztást jelent az összes Expanded gyermek között.

Az elosztási algoritmus három lépésben működik. Első: a Flutter kiszámítja az összes rugalmatlan gyermek intrinsic size értékét. Második: a fennmaradó hely elosztásra kerül az összes flex faktor összegével. Harmadik: minden Expanded a flex faktorának és egy flex egység méretének szorzatával egyenlő részt kap.

Például egy 300px széles Row két Expanded-et tartalmaz: az első flex=2, a második flex=1 értékkel. A szabad hely (300px mínusz a rugalmatlan gyermekek) 3 részre oszlik. Az első 2/3-ot kap, a második — 1/3-ot. Ha nincsenek rugalmatlan gyermekek, az első 200px-t, a második — 100px-t kap.

A flex faktor bármilyen pozitív egész szám lehet. A 0 érték egy speciális eset: a flex=0 értékű Expanded úgy viselkedik, mint egy szokásos rugalmatlan widget, minimális helyet foglalva el a gyermek mérete szerint. Ez a viselkedés egyenértékű az Expanded hiányával.

Következtetés: a flex faktor a kulcs a rugalmas elrendezések építéséhez. Használjon 1:1 arányt egyenlő oszlopokhoz, 2:1 arányt fő- és oldalterülettel rendelkező panelekhez, 3:1 arányt keskeny navigációjú interfészekhez.

Kódpéldák Expanded-del

1. példa bemutatja az Expanded alapvető használatát Row-ban három egyenlő oszlop létrehozásához.

dart
Row(
  children: [
    Expanded(
      child: Container(
        color: Colors.red,
      ),
    ),
    Expanded(
      child: Container(
        color: Colors.green,
      ),
    ),
    Expanded(
      child: Container(
        color: Colors.blue,
      ),
    ),
  ],
)

Ebben a példában három Expanded flex=1 értékkel (alapértelmezett) egyenlően osztja fel a Row szélességét. A tárolók a Row által beállított teljes magasságra nyúlnak és egyenlő részeket foglalnak el. Ez a megközelítés kényelmes oszlopos elrendezések létrehozásához arányos elosztással.

2. példa megmutatja a különböző flex faktorok használatát egy oldalsó panellel és fő tartalommal rendelkező elrendezés létrehozásához.

dart
Row(
  children: [
    Expanded(
      flex: 1,
      child: Container(
        color: Colors.grey.200,
        child: const Center(
          child: Text('Oldalsó panel'),
        ),
      ),
    ),
    Expanded(
      flex: 3,
      child: Container(
        color: Colors.white,
        child: const Center(
          child: Text('Tartalmi terület'),
        ),
      ),
    ),
  ],
)

A második példa egy tipikus layout-ot hoz létre oldalsó panellel (25%) és fő területtel (75%). A flex=1 és flex=3 1:3 arányt ad. A képernyő szélességének változásakor az arányok automatikusan megmaradnak — ez az adaptív interfészek alapja.

Következtetés: az Expanded különböző flex faktorokkal a szabványos eszköz adaptív elrendezések építéséhez. Az Expanded Column-ban történő kombinálása lehetővé teszi mind vízszintes, mind függőleges arányos elrendezések létrehozását.

Tipikus hibák az Expanded használatakor

1. hiba: az Expanded használata Row, Column vagy Flexen kívül. Ha az Expanded-et közvetlenül Stack-be, ListView-ba vagy más olyan tárolóba helyezi, amely nem Flex, a Flutter LayoutException kivételt dob az „Expanded widgets must be placed inside Flex widgets” üzenettel. Megoldás: ellenőrizze a szülő widgetet — csak Row, Column vagy Flex.

2. hiba: az Expanded elhelyezése ListView-ben a shrinkWrap megadása nélkül. A ListView alapértelmezés szerint végtelen magassággal rendelkezik a görgetés irányában, és az Expanded nem tudja kiszámítani a részét. Megoldás: használjon shrinkWrap: true értéket, vagy csomagolja a ListView-t egy rögzített magasságú SizedBox-ba.

3. hiba: több Expanded, amelyek összesített flex-je meghaladja a rendelkezésre álló helyet. Ha egy korlátozott szélességű Row-ban Expanded-ek, valamint nagy intrinsic size-tel rendelkező widgetek találhatók, overflow léphet fel. Megoldás: ellenőrizze a rugalmatlan gyermekek minimális méreteit, és szükség esetén használjon FittedBox-ot vagy Flex fit-et.

4. hiba: beágyazott Expanded Column-ban Row-on belül. Ha az Expanded a Column-ban egy másik Expanded-et tartalmaz a Row-ban, korlátozási konfliktus léphet fel. Megoldás: korlátozza a beágyazás mélységét, vagy használjon ConstrainedBox-ot a méretek explicit megadásához a közbenső szinteken.

Következtetés: az Expanded megfelelő szülő kontextust igényel. Mindig ellenőrizze, hogy az Expanded közvetlenül Row-ban, Column-ban vagy Flex-ben van-e, és kerülje a beágyazást explicit méretek nélkül.

Gyakran Ismételt Kérdések

Miben különbözik az Expanded a SizedBox.expand-tól?

SizedBox.expand kényszerítően kinyújtja a gyermeket a külső korlátozások által meghatározott méretekre, de nem vesz részt a flex elosztásban. Az Expanded csak Flex tárolókon belül működik, és figyelembe veszi a flex faktort a szabad hely gyermekek közötti elosztásakor.

Használható az Expanded Stack-en belül?

Nem. A Stack nem Flex tároló, és az Expanded használata benne LayoutException-t okoz. A gyermekek Stack-ben történő kinyújtásához használjon Positioned.fill vagy BoxConstraints.expand értéket.

Mi történik, ha nem adom meg a flex faktort?

Alapértelmezés szerint flex=1. Az összes Expanded explicit flex nélkül egyenlő részeket kap a szabad helyből. Ha három Expanded van flex nélkül egy Row-ban, mindegyik pontosan a rendelkezésre álló hely egyharmadát foglalja el.

Hogyan lehet az Expanded-et csak szélességre, nem magasságra használni?

Helyezze az Expanded-et egy Row-ba vízszintes kinyújtáshoz. Függőleges kinyújtáshoz használjon Expanded-et Column-on belül. Ha korlátozni kell a méreteket, csomagolja az Expanded-et vagy annak gyermekét egy SizedBox-ba.

Működik az Expanded Wrap vagy Flex widgetekkel?

Expanded a Flex-szel működik, beleértve a Row-t és Column-t is, mint alosztályait. A Wrap nem Flex tároló, és nem támogatja az Expanded-et. A hely elosztásához Wrap-ben használjon más módszereket, például RunAlignment-et.

Összefoglalás

  • Expanded — widget a gyermek kényszerítő kinyújtásához az összes rendelkezésre álló helyre egy Flex tárolóban
  • Flex faktor határozza meg a szabad hely elosztásának arányát több Expanded között
  • Különbség a Flexible-től: Expanded tight fit (kötelező kitöltés), Flexible — loose fit (opcionális) használ
  • Hiba az Expanded Row, Column vagy Flexen kívüli elhelyezése LayoutException-t okoz
  • Alkalmazkodóképesség: az elrendezés arányai automatikusan megmaradnak a képernyő méretének változásakor
  • Ajánlás: használja az Expanded-et elsődleges eszközként oszlopos és panele elrendezésekhez a Flutterben

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