Flexible: mi ez, működési elv és beállítás mobilfejlesztésben

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

Flexible — egy Flutter widget, amely szabályozza, hogy a gyermek elem hogyan foglalja el a rendelkezésre álló helyet egy Flex-konténerben. Az Expanded-től eltérően a Flexible nem kényszeríti a gyermeket a teljes allokált terület kitöltésére — a gyermek widget lehet kisebb, és a fennmaradó hely üresen marad. A Flutter hivatalos dokumentációja (2026) szerint a Flexible olyan forgatókönyvekben szükséges, ahol rugalmas helyelosztásra van szükség kényszerű nyújtás nélkül: minimális szélességű gombok, természetes méretű szövegblokkok és intrinsic constraints-szel rendelkező elemek.

Főbb pontok

  • Flexible — layout widget a rugalmas helyelosztáshoz Row, Column vagy Flex esetén
  • FlexFit.loose lehetővé teszi, hogy a gyermek kisebb legyen az allokált helynél, FlexFit.tight — kitöltésre kényszerít
  • Flexible loose-szal olyan widgetekhez alkalmas, amelyek méretét a tartalomnak kell meghatároznia
  • Különbség az Expanded-től: az Expanded-nek nincs fit paramétere és mindig tight-ként működik
  • Flex-faktor ugyanúgy működik a Flexible és az Expanded esetében — a szabad hely aránya

Mi az a Flexible

Flexible — egy burkoló widget, amely rugalmas helyet biztosít a gyermek elemnek egy Flex-konténerben. A Flexible, akárcsak az Expanded, részt vesz a szabad hely elosztásában, de egy kulcsfontosságú különbséggel: a Flexible gyermeke kevesebb helyet foglalhat el, mint amennyit allokáltak neki, ha a saját mérete kisebb a rendelkezésre álló helynél.

A Flexible a Flutter Flex-algoritmusát használja a rendelkezésre álló hely kiszámításához. Először a keretrendszer lekérdezi az összes nem rugalmas gyermeket (Flexible/Expanded nélküli widgeteket) és kiszámítja azok intrinsic size-ját. A fennmaradó helyet a rugalmas gyermekek között osztja fel arányosan a flex-faktoruk alapján. A hely allokálása után a Flexible ellenőrzi a fit-et — ha loose, akkor a gyermek elemre a “ nem több, mint allokált” korlátozás vonatkozik, lehetővé téve, hogy kicsi maradjon.

A Flexible jellemzője: ha a gyermek widgetnek saját minimális méretei vannak (például Text hosszú karakterlánccal), a Flexible allokálja a kért helyet, nem nyújtja ki erőltetetten. Ez teszi a Flexible-t pótolhatatlanná azoknál az elemeknél, amelyek méretét a tartalomnak kell meghatároznia, nem a konténernek.

Következtetés: használja a Flexible-t, amikor helyet kell fenntartani egy elem számára, de nem akarja azt nyújtásra kényszeríteni. Ez megőrzi a tartalom természetes méretét a rugalmas layout elosztás során.

FlexFit.tight vs FlexFit.loose

FlexFit — egy felsorolás két értékkel: tight és loose. A fit kiválasztásától függ, hogy a gyermek widget erőltetetten ki lesz-e nyújtva az allokált hely méretére.

FlexFit.tight: a gyermek elem tight constraints-et kap — a minimális és maximális méret megegyezik az allokált hellyel. A gyermeknek pontosan annyi helyet kell elfoglalnia, amennyit a Flex-algoritmus allokált. Ha a gyermek kisebb — ki lesz nyújtva. Ha nagyobb — össze lesz nyomva. Viselkedése megegyezik az Expanded-del.

FlexFit.loose: a gyermek elem loose constraints-et kap — a minimális méret 0, a maximális megegyezik az allokált hellyel. A gyermek bármekkora lehet 0 és maximum között. Ha a gyermek kicsi (például Text rövid karakterlánccal), felveszi a természetes szélességét, a többi hely pedig üresen marad.

Következtetés: FlexFit.loose — választás szövegblokkokhoz és természetes méretű elemekhez. FlexFit.tight — szigorú oszlopos elrendezésekhez, ahol minden elemnek azonos szélességűnek vagy magasságúnak kell lennie.

Mikor használjuk a Flexible-t az Expanded helyett

Flexible és Expanded hasonlóan néznek ki, de különböző feladatokat oldanak meg. Az Expanded mindig a teljes rendelkezésre álló helyre nyújtja ki a gyermeket. A Flexible üres helyet hagyhat a gyermek körül, ha a tartalom mérete kisebb, mint az allokált rész.

Forgatókönyv a Flexible-hez: egy Row-ban két gomb található. Az első — „Vásárlás” (rövid szöveg), a második — „Kosárba helyezés” (hosszú szöveg). Az Expanded-del mindkét gomb azonos szélességűre nyúlik, és a rövid szövegnek hatalmas margói lesznek. A Flexible-lel minden gomb a saját szövegének szélességét veszi fel, a szabad hely pedig közöttük vagy a széleken marad.

Forgatókönyv az Expanded-hez: egy Column-ban három kártya található, amelyeknek a tartalomtól függetlenül azonos magasságúnak kell lenniük. Az Expanded egyenlően osztja el a rendelkezésre álló magasságot, és minden kártya azonos méretűre nyúlik. A Flexible loose-szal itt nem alkalmas — a kis kártya kicsi marad, megsértve az egységes dizájnt.

Következtetés: válassza a Flexible-t, amikor a tartalom határozza meg az elem méretét, és a körülötte lévő üres hely elfogadható. Válassza az Expanded-et, amikor minden elemnek a tartalomtól függetlenül azonos méretűnek kell lennie.

Kódpéldák Flexible-lel

1. példa bemutatja a Flexible alapvető használatát FlexFit.loose-szal egy Row-ban.

dart
Row(
  children: [
    Flexible(
      fit: FlexFit.loose,
      child: Container(
        color: Colors.amber,
        child: const Text('rövid'),
      ),
    ),
    Flexible(
      fit: FlexFit.loose,
      child: Container(
        color: Colors.cyan,
        child: const Text('hosszú szöveg a demóhoz'),
      ),
    ),
  ],
)

A példában mindkét Flexible loose fit-tel. Az első konténer rövid szöveggel felveszi a természetes szélességét. A második hosszú szöveggel — a sajátját. A Row mindegyiknek allokálja a rendelkezésre álló szélesség felét, de a loose fit lehetővé teszi, hogy a konténerek kisebbek legyenek, és a szabad hely üresen marad közöttük.

2. példa — a Flexible összehasonlítása Tight és Loose fit-tel egy Column-ban.

dart
Column(
  children: [
    Flexible(
      fit: FlexFit.tight,
      child: const Card(
        child: ListTile(
          title: Text('Tight — teljes magasságra nyújtva'),
        ),
      ),
    ),
    const SizedBox(
      height: 8,
    ),
    Flexible(
      fit: FlexFit.loose,
      child: const Card(
        child: ListTile(
          title: Text('Loose — természetes magasság'),
        ),
      ),
    ),
  ],
)

A Column-ban az első Flexible (tight) a Card-ot a rendelkezésre álló magasság felére nyújtja. A második Flexible (loose) — a Card a tartalom szerinti magasságot veszi fel, a többi hely pedig üresen marad. Vizuálisan látható, hogy a tight erőltetetten kitölti a területet, míg a loose megtartja a kompakt méretet.

Következtetés: éles kódban a Flexible loose-t űrlapmezőkhöz, gombokhoz és szövegblokkokhoz alkalmazzák. A Flexible tight — az Expanded megfelelője, egyenletes elosztáshoz használják.

Gyakori hibák a Flexible használatakor

1. hiba: a Flexible használata Flex-konténeren kívül. Az Expanded-hez hasonlóan a Flexible is LayoutException-t dob, ha nem Row, Column vagy Flex belsejében van. Megoldás: mindig ellenőrizze a widgetek szülőláncát.

2. hiba: a Flexible és az Expanded összekeverése. A fejlesztők gyakran használják az Expanded-et, amikor Flexible kellene loose fit-tel, és fordítva. Eredmény: az Expanded kinyújtja a rövid szövegű elemet, nagy üres mezőket létrehozva. Megoldás: ha az elem mérete kisebb lehet az allokált helynél — használja a Flexible(fit: FlexFit.loose)-t.

3. hiba: nulla flex-faktor. A flex=0-val rendelkező Flexible nem rugalmas widgetként viselkedik, ami nem nyilvánvaló. A fejlesztő rugalmas viselkedést vár, de az elem a minimális méretet veszi fel. Megoldás: a flex-nek ≥1-nek kell lennie az aktív helyelosztáshoz.

4. hiba: Flexible ScrollView-ban méretkorlátozás nélkül. Ha a Flexible egy SingleChildScrollView-n belüli Column-ban van, a scroll-konténer végtelen helyet ad, és a flex-elosztás nem működik. Megoldás: korlátozza a scroll-konténer méretét SizedBox vagy ConstrainedBox segítségével.

Következtetés: a Flexible ugyanolyan figyelmet igényel a szülői kontextusra, mint az Expanded. A különbség csak a fit-ben van — válassza tudatosan a feladattól függően.

Gyakran Ismételt Kérdések

Miben különbözik a Flexible az Expanded-től?

Expanded — ez a Flexible fix fit=tight paraméterrel. A különbség az, hogy az Expanded szigorúan kötődik a teljes rendelkezésre álló hely kitöltéséhez, míg a Flexible használhatja a loose fit-et a gyermek természetes méretének megőrzésére.

Melyik fit-et válasszam a gombokhoz Row-ban?

Különböző szöveghosszúságú gombokhoz használja a Flexible(fit: FlexFit.loose)-t. Minden gomb a tartalom szerinti szélességet veszi fel, és nem lesz aránytalanság közöttük. Az Expanded az összes gombot azonos szélességűvé teszi.

Hogyan lehet a Flexible-t Expanded-ként viselkedésre bírni?

Állítsa be a fit: FlexFit.tight paramétert — a Flexible kényszeríti a gyermeket a teljes allokált hely kitöltésére. Ebben a módban a Flexible teljesen azonos az Expanded-del a viselkedésében.

Csökkentheti-e a Flexible a gyermek méretét?

Igen, ha a gyermek nagyobb, mint az allokált hely. A Flexible olyan constraints-eket ad át, amelyek maximális mérete megegyezik a Flex-konténer részével. Ha a gyermek meghaladja ezt a méretet, a constraints-ek határain belül összenyomódik.

Működik-e a Flexible közvetlenül a Flex konténerrel?

Igen, a Flexible bármilyen Flex-konténerrel működik, beleértve a Row-t, Column-t és az alap Flex widgetet tetszőleges direction-nel. A Flex lehetővé teszi a nem szabványos irányok beállítását a mainAxisAlignment és crossAxisAlignment segítségével.

Összefoglalás

  • Flexible — widget a rugalmas helyelosztáshoz a gyermek kényszerű nyújtása nélkül
  • FlexFit.loose megőrzi a tartalom természetes méretét, FlexFit.tight erőltetetten kitölti a területet
  • Expanded — a Flexible speciális esete fit=tight paraméterrel, használja a Flexible-t amikor fit választás szükséges
  • Flex-faktor ugyanúgy működik a Flexible és az Expanded esetében — a szabad hely aránya
  • Loose fit ideális gombokhoz, szövegblokkokhoz és dinamikus tartalmú elemekhez
  • Javaslat: alkalmazza a Flexible-t loose-szal azokhoz a komponensekhez, amelyek méretét a tartalom határozza meg

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