SliverGridDelegate
Grid responsif dengan MaxCrossAxisExtent dan variasi ukuran sel.
Dua Delegate, Dua Filosofi
Modul sebelumnya memakai SliverGridDelegateWithFixedCrossAxisCount: jumlah kolom tetap, misalnya selalu 2. Itu bagus kalau desainmu menuntut tepat 2 kolom di semua perangkat, tapi kaku: di tablet lebar, 2 kolom raksasa terlihat kosong.
SliverGridDelegateWithMaxCrossAxisExtent membalik cara berpikirnya: bukan "berapa kolom?", melainkan "berapa lebar maksimum tiap sel?". Flutter lalu menghitung sendiri jumlah kolom dari lebar layar yang tersedia. Satu baris kode, dan gridmu responsif di HP, tablet, dan desktop.
Contoh 1: Galeri Responsif Otomatis
GridView.builder(
padding: const EdgeInsets.all(12),
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 150,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
childAspectRatio: 1,
),
itemCount: foto.length,
itemBuilder: (context, index) => ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(foto[index], fit: BoxFit.cover),
),
)Dengan maxCrossAxisExtent: 150: di HP 360px lebar muncul 2 kolom, di tablet 800px muncul 5 kolom, tanpa satu baris kode kondisional pun. childAspectRatio: 1 membuat tiap sel persegi.
Contoh 2: Menu Dashboard Adaptif dengan Tinggi Pasti
Untuk kartu menu berisi ikon + label, tinggi sel lebih mudah diprediksi daripada rasio. Pakai mainAxisExtent untuk menetapkan tinggi sel secara langsung:
GridView.builder(
padding: const EdgeInsets.all(16),
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 180,
mainAxisExtent: 120,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
),
itemCount: menu.length,
itemBuilder: (context, index) {
final m = menu[index];
return Card(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(m.ikon, size: 32, color: Colors.deepPurple),
const SizedBox(height: 8),
Text(m.nama, style: const TextStyle(fontSize: 13)),
],
),
);
},
)Edge Cases
maxCrossAxisExtentbukan lebar yang dijamin. Flutter membagi lebar yang tersedia menjadi kolom-kolom yang lebarnya tidak melebihi nilai itu. Contoh: layar 360px denganmaxCrossAxisExtent: 200menghasilkan 1 kolom selebar 360px (melebar penuh), bukan sel 200px. Kalau kamu butuh tepat N kolom, kembali keFixedCrossAxisCount.- Rotasi layar menghitung ulang otomatis, tapi posisi scroll bisa melompat karena jumlah item per baris berubah. Untuk grid panjang, pasang
PageStorageKeyagar posisi scroll tersimpan saat rotasi. mainAxisExtentmengalahkanchildAspectRatio. Kalau keduanya diisi, yang dipakai adalahmainAxisExtentdan rasio diabaikan. Pilih salah satu saja supaya tidak membingungkan.
Kapan JANGAN Memakai MaxCrossAxisExtent
- Desain menuntut tepat N kolom di semua ukuran, misalnya tombol kalkulator yang harus selalu 4 kolom: pakai
SliverGridDelegateWithFixedCrossAxisCount. - Sel dengan tinggi sangat bervariasi (grid ala Pinterest): pakai
MasonryGridViewdari packageflutter_staggered_grid_view. Tapi sadari biayanya: layout non-seragam lebih berat dihitung dan lebih sulit diprediksi, jadi hindari untuk daftar yang sangat panjang atau sering berubah.
Praktik Terbaik
- Untuk aplikasi yang jalan di web atau desktop dengan lebar jendela bebas,
MaxCrossAxisExtenthampir selalu pilihan yang tepat. - Uji di minimal tiga lebar: HP kecil (360px), HP besar (430px), dan tablet (800px ke atas). Putar emulator ke landscape dan pastikan tidak ada sel yang terlihat aneh.
- Kombinasikan dengan
SliverGriddi dalamCustomScrollViewkalau grid hanyalah satu bagian dari halaman scroll yang kompleks.
Catatan teknis: Kedua delegate ini juga tersedia untuk
SliverGrid(bukan cumaGridView), jadi pengetahuan ini langsung terpakai saat kamu naik keCustomScrollViewdan sliver.
Tantangan
Grid adaptif
Buat GridView dengan maxCrossAxisExtent 120 yang menampilkan 12 kotak bernomor. Putar emulator landscape dan perhatikan kolom bertambah.
Kuis Bab
Uji pemahamanmu: Layout, List & Grid
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Pada Column, properti apa yang mengatur posisi vertikal anak?
2.Apa fungsi Expanded di dalam Row?
3.Kapan memakai Stack + Positioned?
4.Kenapa ListView.builder lebih baik untuk 1000 item?
5.Bagaimana membuat GridView 2 kolom?