Grid 可組合函式會建立結構化的二維畫面版面配置。Grid 使用明確定義的軌道 (列和欄) 和間隙,定義回應式版面配置結構,做為 UI 的基礎架構。
由於 Grid 是結構性容器,而非延遲載入容器,因此您必須明確定義其中放置的每個元素,而不會在捲動時回收項目。因此,直接在 Grid 中算繪大型或動態資料集,可能會導致效能瓶頸,因為所有項目會同時組成。
如要在結構化畫面版面配置中顯示大量資料,請在 Grid 儲存格中嵌入延遲元件,例如 LazyColumn 或 LazyRow。但請注意:彈性軌道 (具有 1.fr 等規格) 會查詢子項元素的內建大小。由於 SubcomposeLayout 不支援內建測量傳遞,因此將 Lazy 清單放在彈性軌道內會導致 IllegalStateException 異常終止。如要安全地將 Lazy 清單放在彈性網格軌道中,您必須使用 GridTrackSize.MinMax 大小 (例如 minmax(0.dp, 1.fr)),略過內建測量階段。

LazyColumn。最佳做法
- 使用延遲清單,而非大型明確迴圈:如要在結構化
Grid中顯示大型或動態資料集,請在特定格線儲存格中嵌入延遲元件 (通常是LazyColumn或LazyRow),而非在項目上建立大型明確迴圈,因為Grid不會回收項目,且限制為 1000 個軌道。 - 對 Lazy 清單使用
MinMax軌道大小調整:由於LazyColumn和LazyRow不支援內建測量傳遞 (請參閱SubcomposeLayout),請在託管 Lazy 元件的彈性軌道上使用GridTrackSize.MinMax,安全地略過內建測量。
要件
Grid:可組合版面配置,可將項目放置在 2D 格線結構中,並使用明確的列和欄軌跡進行設定。LazyColumn:垂直捲動清單,只會組合及回收目前在畫面上顯示的項目。GridTrackSize.MinMax:追蹤大小屬性,定義彈性邊界 (min和max),安全地託管延遲元件,不會觸發執行階段測量當機。gridItem:ComposeModifier擴充功能,可將子 UI 元素指派給Grid內的特定儲存格或命名區域。
步驟
定義語意區域 ID、使用 minmax 大小設定格線軌跡,確保與 Lazy 清單相容,並在格線內容區域中嵌入 LazyColumn,藉此建構畫面版面配置。
1. 設定格線軌跡和命名區域
建立 enum 類別來代表螢幕版面配置的不同區域,並為版面配置軌道和命名區域定義 GridConfigurationScope lambda。請使用 GridTrackSize.MaxContent 讓頁首和頁尾列符合其內容尺寸,並使用 minmax(0.dp, 1.fr) 讓託管 Lazy 清單的內容軌道分配彈性空間,而不查詢不支援的內建測量:
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. 在格線中放置靜態元件
在可組合函式中,將 lazyConfig 傳遞至 Grid 容器。在 content lambda 中,放置靜態元件 (Header 和 Footer),並使用 Modifier.gridItem() 搭配各自的區域 ID 進行定位。
3. 在內容區域中嵌入 LazyColumn
在內容儲存格中,使用 Modifier.gridItem(ScreenArea.Content) 嵌入 LazyColumn。由於內容軌道在步驟 1 中已設定 minmax(0.dp, 1.fr),因此 LazyColumn 可以在捲動時安全地測量及回收項目,而無需查詢不支援的固有維度:
@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)) } } } }
結果
您的畫面版面配置現在會使用 Grid API 定義整體的二維頁面結構,同時在具有 minmax 大小的彈性軌道中嵌入 LazyColumn,以便有效回收清單項目,並避免執行階段例外狀況。