Expanded: bu nima, Flutter'da ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-07-03 O'qish vaqti: 6 daq

Expanded — Flutter vidjeti bo‘lib, bola elementni Flex konteyneridagi barcha mavjud joyni to‘ldirishga majbur qiladi. Row yoki Column bolalar o‘rtasida joyni taqsimlaganda, Expanded egiluvchan bo‘lmagan elementlar hisobga olingandan so‘ng bo‘sh joyni oladi. Flutter rasmiy hujjatlariga ko‘ra (2026), Expanded eng ko‘p ishlatiladigan layout vidjetlaridan biri: u interfeyslarni foizlashda, kartochkalar, ro‘yxatlar va panellarni qurishda qo‘llaniladi. Uning asosiy afzalligi — o‘lchamlarni aniq ko‘rsatmasdan flex koeffitsienti asosida kenglik yoki balandlikni avtomatik hisoblash.

Asosiy ma’lumotlar

  • Expanded — bolani Row, Column yoki Flex'dagi barcha bo‘sh joyga cho‘zuvchi layout vidjeti
  • Flex-faktor har bir Expanded qancha bo‘sh joy olishini aniqlaydi
  • Expanded Flexible'dan barcha mavjud joyni majburiy to‘ldirishi bilan farqlanadi
  • Stack Expanded'ni qo‘llab-quvvatlamaydi, faqat Row, Column va Flex
  • Xato — Expanded'ni Flex konteyneridan tashqarida ishlatish LayoutException'ga sabab bo‘ladi

Expanded nima

Expanded — child qabul qiluvchi va uni Flex konteynerida (Row, Column, Flex) mavjud joyni to‘ldirish uchun kengayishga majbur qiluvchi o‘rovchi vidjet. Expanded ning o‘z vizual ko‘rinishi yo‘q — u faqat bola elementga uzatiladigan constraints'larni boshqaradi.

Expanded asosida Flutter freymvorki tomonidan taqdim etilgan Flex mexanizmi yotadi. Row yoki Column bolalarining o‘lchamlarini hisoblaganda, avval egiluvchan bo‘lmagan elementlarga (qat’iy o‘lchamli oddiy vidjetlarga) joy ajratadi, qolgan joyni esa Expanded va Flexible bolalar o‘rtasida ularning flex-faktorlariga mutanosib ravishda taqsimlaydi.

Expanded Flexible.fit = FlexFit.tight dan foydalanadi. Bu Expanded bolasi o‘zining o‘lchami kichikroq bo‘lsa ham, ajratilgan barcha joyni egallashi kerak degan ma’noni anglatadi. Bola ajratilgan sohadan kichikroq bo‘lishi mumkin bo‘lgan Fit.loose bilan Flexible'dan farqli o‘laroq, Expanded tarkibni majburiy cho‘zadi.

Xulosa: Expanded Flutter'da proporsional maketlar yaratish uchun asosiy vositadir. Element barcha mavjud kenglik yoki balandlikni kafolatli egallashi kerak bo‘lganda foydalaning.

Expanded vs Flexible: asosiy farqlar

Expanded va Flexible — ikkalasi ham Flex konteynerlarida joyni taqsimlaydi, lekin tubdan farqli harakat qiladi. Farq fit xususiyatida bo‘lib, u bolaning mavjud joydan kichikroq bo‘lishi mumkinligini aniqlaydi.

Expanded qattiq xatti-harakat modeliga ega: uning fit FlexFit.tight ga teng. Bu shuni anglatadiki, bola vidjet mavjud joyga teng constraints oladi — na ko‘p, na kam. Bola kichikroq bo‘lsa, cho‘ziladi. Kattaroq bo‘lsa, siqiladi. Flexible FlexFit.loose dan foydalanadi, bola elementga ajratilgan joy doirasida istalgan o‘lchamda bo‘lishga imkon beradi.

Amalda: Row ichida flex=1 bo‘lgan ikkita Expanded bo‘lsa, har biri kenglikning to‘liq yarmini egallaydi. Ularni fit.loose bilan Flexible bilan almashtirsangiz, har bir bola o‘z o‘lchami kichikroq bo‘lsa, yarmidan kichikroq bo‘lishi mumkin — qolgan joy bo‘sh qoladi.

Xulosa: qat’iy proporsional maketlar uchun Expanded, bola mavjud joydan kichikroq bo‘lishi mumkin bo‘lgan hollarda Flexible dan foydalaning. Ishonchingiz komil bo‘lmasa, Expanded dan boshlang — u oldindan bashorat qilish mumkin bo‘lgan xatti-harakatni beradi.

Flex-faktor: joy taqsimlanishi

Flex-faktor (flex parametri) — Expanded oladigan mavjud joy ulushini belgilaydigan raqamli qiymat. Odatiy bo‘lib flex=1, ya’ni barcha Expanded bolalar o‘rtasida teng taqsimlash.

Taqsimlash algoritmi uch bosqichda ishlaydi. Birinchi: Flutter barcha egiluvchan bo‘lmagan bolalarning intrinsic size sini hisoblaydi. Ikkinchi: qolgan joy barcha flex-faktorlar yig‘indisiga bo‘linadi. Uchinchi: har bir Expanded o‘z flex-faktorining bir flex birligi o‘lchamiga ko‘paytmasiga teng ulush oladi.

Masalan, kengligi 300px bo‘lgan Row ikkita Expanded ni o‘z ichiga oladi: birinchisi flex=2, ikkinchisi flex=1. Bo‘sh joy (300px minus egiluvchan bo‘lmagan bolalar) 3 qismga bo‘linadi. Birinchisi 2/3, ikkinchisi — 1/3 oladi. Egiluvchan bo‘lmagan bolalar bo‘lmasa, birinchisi 200px, ikkinchisi — 100px oladi.

Flex-faktor har qanday musbat butun son bo‘lishi mumkin. 0 qiymati alohida holat: flex=0 bo‘lgan Expanded bolaning o‘lchamiga ko‘ra minimal joyni egallagan oddiy egiluvchan bo‘lmagan vidjet kabi harakat qiladi. Bu xatti-harakat Expanded ning yo‘qligiga teng.

Xulosa: flex-faktor egiluvchan maketlar qurishning kalitidir. Teng ustunlar uchun 1:1, asosiy va yon sohali panellar uchun 2:1, tor navigatsiyali interfeyslar uchun 3:1 nisbatlaridan foydalaning.

Expanded bilan kod misollari

Misol 1 uchta teng ustun yaratish uchun Row'da Expanded dan asosiy foydalanishni namoyish etadi.

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

Ushbu misolda flex=1 (odatiy) bo‘lgan uchta Expanded Row kengligini teng taqsimlaydi. Konteynerlar Row tomonidan belgilangan barcha balandlikkacha cho‘ziladi va teng ulushlarni egallaydi. Bu yondashuv proporsional taqsimot bilan ustun maketlarini yaratish uchun qulay.

Misol 2 yon panel va asosiy tarkibli maket yaratish uchun turli flex-faktorlardan foydalanishni ko‘rsatadi.

dart
Row(
  children: [
    Expanded(
      flex: 1,
      child: Container(
        color: Colors.grey.200,
        child: const Center(
          child: Text('Yon panel'),
        ),
      ),
    ),
    Expanded(
      flex: 3,
      child: Container(
        color: Colors.white,
        child: const Center(
          child: Text('Kontent sohasi'),
        ),
      ),
    ),
  ],
)

Ikkinchi misol yon panel (25%) va asosiy soha (75%) bilan tipik layout yaratadi. flex=1 va flex=3 1:3 nisbatini beradi. Ekran kengligi o‘zgarganda nisbatlar avtomatik saqlanadi — bu adaptiv interfeyslarning asosidir.

Xulosa: turli flex-faktorlar bilan Expanded adaptiv maketlar qurish uchun standart vositadir. Expanded ni Column da birlashtirish ham gorizontal, ham vertikal proporsional joylashuvlarni yaratishga imkon beradi.

Expanded ishlatishda tipik xatolar

Xato 1: Expanded ni Row, Column yoki Flex dan tashqarida ishlatish. Expanded ni to‘g‘ridan-to‘g‘ri Stack, ListView yoki Flex bo‘lmagan boshqa konteynerga joylashtirsangiz, Flutter “Expanded widgets must be placed inside Flex widgets” xabari bilan LayoutException chiqaradi. Yechim: ota-vidjetni tekshiring — faqat Row, Column yoki Flex.

Xato 2: Expanded ni shrinkWrap ko‘rsatmasdan ListView ichida joylashtirish. ListView odatiy bo‘lib aylantirish yo‘nalishida cheksiz balandlikka ega va Expanded o‘z ulushini hisoblay olmaydi. Yechim: shrinkWrap: true dan foydalaning yoki ListView ni qat’iy balandlikdagi SizedBox bilan o‘rang.

Xato 3: umumiy flex i mavjud joydan oshib ketadigan bir nechta Expanded. Cheklangan kenglikdagi Row ichida Expanded va katta intrinsic size li vidjetlar bo‘lsa, overflow yuz berishi mumkin. Yechim: egiluvchan bo‘lmagan bolalarning minimal o‘lchamlarini tekshiring va kerak bo‘lganda FittedBox yoki Flex fit dan foydalaning.

Xato 4: Row ichidagi Column da ichma-ich Expanded. Column ichidagi Expanded Row ichidagi boshqa Expanded ni o‘z ichiga olsa, constraints ziddiyati yuz berishi mumkin. Yechim: ichma-ichlik chuqurligini cheklang yoki oraliq darajalarda o‘lchamlarni aniq belgilash uchun ConstrainedBox dan foydalaning.

Xulosa: Expanded to‘g‘ri ota-kontekstni talab qiladi. Har doim Expanded ning to‘g‘ridan-to‘g‘ri Row, Column yoki Flex da joylashganligini tekshiring va aniq o‘lchamlarsiz ichma-ichlikdan qoching.

Tez-tez so‘raladigan savollar

Expanded SizedBox.expand dan nimasi bilan farq qiladi?

SizedBox.expand bolani tashqi constraints bilan belgilangan o‘lchamlargacha majburiy cho‘zadi, lekin flex taqsimotida qatnashmaydi. Expanded faqat Flex konteynerlari ichida ishlaydi va bolalar o‘rtasida bo‘sh joyni taqsimlashda flex-faktorni hisobga oladi.

Expanded ni Stack ichida ishlatish mumkinmi?

Yo‘q. Stack Flex konteyneri emas va uning ichida Expanded ishlatish LayoutException ga sabab bo‘ladi. Stack da bolalarni cho‘zish uchun Positioned.fill yoki BoxConstraints.expand dan foydalaning.

Flex-faktor ko‘rsatilmasa nima bo‘ladi?

Odatiy bo‘lib flex=1. Aniq flex ko‘rsatilmagan barcha Expanded bo‘sh joyning teng ulushlarini oladi. Row da flexsiz uchta Expanded bo‘lsa, har biri mavjud joyning to‘liq uchdan birini egallaydi.

Expanded ni faqat kenglikka, balandlikka emas, qanday qilish mumkin?

Gorizontal cho‘zish uchun Expanded ni Row ga joylashtiring. Vertikal cho‘zish uchun Expanded ni Column ichida ishlating. O‘lchamlarni cheklash kerak bo‘lsa, Expanded yoki uning bolasini SizedBox bilan o‘rang.

Expanded Wrap yoki Flex vidjetlari bilan ishlaydimi?

Expanded Flex bilan, shu jumladan uning pastki sinflari Row va Column bilan ishlaydi. Wrap Flex konteyneri emas va Expanded ni qo‘llab-quvvatlamaydi. Wrap da joyni taqsimlash uchun RunAlignment kabi boshqa usullardan foydalaning.

Xulosa

  • Expanded — bolani Flex konteyneridagi barcha mavjud joygacha majburiy cho‘zuvchi vidjet
  • Flex-faktor bir nechta Expanded o‘rtasida bo‘sh joy taqsimlanish nisbatini belgilaydi
  • Flexible dan farqi: Expanded tight fit (majburiy to‘ldirish), Flexible — loose fit (ixtiyoriy) ishlatadi
  • Xato — Expanded ni Row, Column yoki Flex dan tashqarida joylashtirish LayoutException keltirib chiqaradi
  • Moslashuvchanlik: maket nisbatlari ekran o‘lchami o‘zgarganda avtomatik saqlanadi
  • Tavsiya: Flutter'da ustun va panel maketlari uchun Expanded ni asosiy vosita sifatida ishlating

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing