Composable Grid membuat tata letak layar dua dimensi yang terstruktur.
Grid menentukan struktur tata letak responsif menggunakan jalur (baris dan kolom) dan ruang yang ditentukan secara eksplisit sebagai arsitektur dasar UI Anda.
Karena Grid adalah penampung struktural, bukan pemuatan lambat, Anda harus menentukan setiap elemen yang ditempatkan di dalamnya secara eksplisit tanpa mendaur ulang item saat men-scroll.
Akibatnya, merender set data besar atau dinamis secara langsung dalam Grid dapat menyebabkan hambatan performa karena semua item disusun secara bersamaan.
Untuk menampilkan kumpulan data besar dalam tata letak layar terstruktur, sematkan
komponen yang dimuat secara lambat seperti LazyColumn atau LazyRow di sel Grid.
Namun, perhatikan: jalur fleksibel (dengan spesifikasi seperti 1.fr) mengkueri
ukuran intrinsik elemen turunan. Karena SubcomposeLayout tidak mendukung penerusan pengukuran intrinsik,
menempatkan daftar lambat di dalam jalur fleksibel menyebabkan error
IllegalStateException. Untuk menempatkan daftar lambat dengan aman di dalam jalur
petak fleksibel, Anda harus menggunakan ukuran GridTrackSize.MinMax (seperti minmax(0.dp, 1.fr))
untuk melewati proses pengukuran intrinsik.
LazyColumn yang disematkan untuk konten.Praktik terbaik
- Gunakan daftar lambat, bukan loop eksplisit besar: Untuk menampilkan set data besar atau dinamis dalam
Gridterstruktur, sematkan komponen lambat (biasanyaLazyColumnatauLazyRow) di dalam sel petak tertentu, bukan membuat loop eksplisit besar pada item, karenaGridtidak mendaur ulang item dan memiliki batas 1.000 jalur. - Gunakan ukuran trek
MinMaxuntuk daftar lambat: KarenaLazyColumndanLazyRowtidak mendukung penerusan pengukuran intrinsik (lihatSubcomposeLayout), gunakanGridTrackSize.MinMaxpada trek fleksibel yang menghosting komponen lambat untuk melewati pengukuran intrinsik dengan aman.
Bahan
Grid: Tata letak composable yang menempatkan item dalam struktur petak dua dimensi yang dikonfigurasi menggunakan jalur baris dan kolom eksplisit.LazyColumn: Daftar yang men-scroll secara vertikal yang hanya menyusun dan mendaur ulang item yang saat ini terlihat di layar.GridTrackSize.MinMax: Properti pengubahan ukuran jalur yang menentukan batas fleksibel (mindanmax) untuk menghosting komponen yang dimuat lambat dengan aman tanpa memicu error pengukuran runtime.gridItem: Ekstensi ComposeModifieryang menetapkan elemen UI turunan ke sel tertentu atau area bernama di dalamGrid.
Langkah
Susun tata letak layar Anda dengan menentukan ID area semantik, mengonfigurasi
jalur petak dengan ukuran minmax untuk kompatibilitas daftar lambat, dan menyematkan
LazyColumn di dalam area konten petak.
1. Mengonfigurasi jalur petak dan area bernama
Buat class enum untuk merepresentasikan area berbeda dari tata letak layar Anda,
dan tentukan lambda GridConfigurationScope untuk jalur tata letak dan area bernama. Gunakan GridTrackSize.MaxContent untuk baris header dan footer agar sesuai dengan dimensi kontennya, dan gunakan minmax(0.dp, 1.fr) untuk jalur konten yang menghosting daftar lambat untuk mengalokasikan ruang fleksibel tanpa mengkueri pengukuran intrinsik yang tidak didukung:
enum class ScreenArea { Header, Content, Footer } val lazyConfig: GridConfigurationScope.() -> Unit = { column(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) row(minmax(0.dp, 1.fr)) row(GridTrackSize.MaxContent) area(ScreenArea.Header, row = 1, column = 1) area(ScreenArea.Content, row = 2, column = 1) area(ScreenArea.Footer, row = 3, column = 1) gap(8.dp) }
2. Menempatkan komponen statis di Petak
Di composable Anda, teruskan lazyConfig ke penampung Grid. Di dalam
lambda content, tempatkan komponen statis (Header dan Footer) dan posisikan
menggunakan Modifier.gridItem() dengan ID area masing-masing.
3. Menyematkan LazyColumn di area konten
Di sel konten, sematkan LazyColumn menggunakan Modifier.gridItem(ScreenArea.Content).
Karena jalur konten dikonfigurasi dengan minmax(0.dp, 1.fr) di Langkah 1,
LazyColumn dapat mengukur dan mendaur ulang item dengan aman saat men-scroll tanpa mengkueri dimensi intrinsik yang tidak didukung:
@Composable fun GridWithLazyColumn( modifier: Modifier = Modifier, items: List<String> = emptyList(), ) { Grid( modifier = modifier.fillMaxSize(), config = lazyConfig ) { Text("Header", Modifier.gridItem(ScreenArea.Header).padding(16.dp)) Text("Footer", Modifier.gridItem(ScreenArea.Footer).padding(16.dp)) // LazyColumn placed in the content area for large datasets LazyColumn( modifier = Modifier .gridItem(ScreenArea.Content) .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) { item -> Text(item, Modifier.padding(16.dp)) } } } }
Hasil
Tata letak layar Anda kini menggunakan Grid API untuk menentukan struktur halaman dua dimensi secara keseluruhan, sekaligus menyematkan LazyColumn dalam jalur fleksibel dengan penskalaan minmax untuk mendaur ulang item daftar secara efisien dan menghindari pengecualian runtime.