Expanded dan Flexible: Mengatur Ruang Sisa
Bagi ruang kosong antar widget dengan Expanded dan Flexible, pahami flex factor dan beda keduanya.
Masalah yang diselesaikan
Di dalam Row, setiap anak hanya selebar kebutuhannya. Sisa ruang horizontal terbuang sia-sia. Expanded memaksa anaknya mengisi semua sisa ruang yang tersedia.
Row(
children: [
const Icon(Icons.search),
const SizedBox(width: 8),
Expanded(
child: TextField(
decoration: const InputDecoration(hintText: 'Cari produk...'),
),
),
],
)Ini pola search bar klasik: ikon tetap kecil, field pencarian melar mengisi sisa lebar layar di semua ukuran HP.
Flex factor: berbagi proporsional
Kalau ada beberapa Expanded, ruang dibagi proporsional sesuai flex (default 1):
Row(
children: [
Expanded(
flex: 2,
child: Container(color: Colors.teal, height: 60),
),
Expanded(
flex: 1,
child: Container(color: Colors.amber, height: 60),
),
],
)Kotak teal mendapat dua pertiga lebar, kotak amber sepertiga. Ini cara membuat kolom proporsional tanpa menghitung piksel manual.
Expanded vs Flexible
Keduanya mirip, bedanya di aturan ukuran:
Expandedsama denganFlexibleber-fit: FlexFit.tight. Anak wajib mengisi penuh ruang yang dijatahkan.Flexibledefault-nyaFlexFit.loose. Anak boleh lebih kecil dari jatahnya.
Row(
children: [
Flexible(
child: Container(
color: Colors.blue,
height: 60,
padding: const EdgeInsets.all(8),
child: const Text('Bebas'),
),
),
const Expanded(child: SizedBox(height: 60)),
],
)Pakai Flexible saat anak punya ukuran natural yang ingin dipertahankan (misalnya teks pendek), pakai Expanded saat ingin memaksa mengisi ruang.
Spacer: jalan pintas
Butuh mendorong widget ke ujung? Spacer() adalah Expanded berisi SizedBox kosong. Sangat berguna untuk layout "kiri-kanan" tanpa menghitung.
const Row(
children: [
Text('Kasir'),
Spacer(),
Icon(Icons.notifications),
],
)Catatan teknis:
ExpandeddanFlexiblehanya boleh menjadi anak langsung dariRow,Column, atauFlex. Menaruhnya di dalamContaineratauStackmenghasilkan error "Incorrect use of ParentDataWidget". Kalau butuh perilaku mirip di luar Flex, pakaiSizedBox.expandatau atur constraints manual. Error ini membingungkan pemula karena pesannya teknis, tapi intinya: Expanded butuh parent Flex.