Skip to content

使用修飾符

修飾符 (Modifiers) 允許您裝飾或增強可組合項 (composable)。使用修飾符,您可以:

  • 改變可組合項的大小、佈局、行為和外觀。
  • 添加資訊,例如輔助使用標籤 (accessibility labels)。
  • 處理使用者輸入。
  • 添加高階互動,例如使元素可點擊、可滾動、可拖曳或可縮放。

鏈式修飾符

修飾符可以鏈接在一起以應用多種效果:

kotlin
@Composable
private fun Greeting(name: String) {
    Column(
        // 鏈式 Modifier 函數:
        modifier = Modifier
            // Modifier.padding(24.dp) 在欄位周圍添加邊距
            .padding(24.dp)
            // Modifier.fillMaxWidth() 使欄位擴展以填滿可用寬度
            .fillMaxWidth()
    ) {
        Text(text = "Hello,")
        Text(text = name)
    }
}

修飾符函數在鏈中的順序非常重要。每個函數都會對前一個函數返回的 Modifier 進行修改,因此呼叫的順序直接影響可組合項的最終行為和外觀。

內建修飾符

Compose Multiplatform 提供內建修飾符,例如 sizepaddingoffset,用於處理常見的佈局和定位任務。

尺寸修飾符

要設定固定尺寸,請使用 size 修飾符。當需要覆寫限制時,請使用 requiredSize 修飾符:

kotlin
@Composable
fun Card() {
    // 將列的尺寸設定為 400x100 dp
    Row(modifier = Modifier.size(width = 400.dp, height = 100.dp)
    ) {
        Image(
            // 將所需的尺寸設定為 150x150 dp,並覆寫父級 100 dp 的限制
            modifier = Modifier.requiredSize(150.dp)
        )
        Column {
            // 內容佔用列內剩餘的空間
        }
    }
}

邊距修飾符

使用 padding 修飾符在元素周圍添加邊距。您還可以使用 paddingFromBaseline 根據基線動態應用邊距:

kotlin
@Composable
fun Card() {
    Row {
        Column {
            // 應用邊距以調整相對於基線的位置
            Text(
                text = "Title",
                modifier = Modifier.paddingFromBaseline(top = 50.dp)
            )
            // 沒有指定邊距,因此遵循預設排列
            Text(text = "Subtitle")
        }
    }
}

位移修飾符

若要調整佈局相對於其原始位置的定位,請使用 offset 修飾符。請指定 X 和 Y 軸上的位移:

kotlin
@Composable
fun Card() {
    Row {
        Column {
            // 正常定位文字,不應用任何位移
            Text(text = "Title")
            
            // 將文字沿著 X 軸向右輕微移動 4.dp,
            // 同時保持原始的垂直位置
            Text(
                text = "Subtitle",
                modifier = Modifier.offset(x = 4.dp)
            )
        }
    }
}

作用域修飾符

作用域修飾符 (Scoped modifiers),也稱為父資料修飾符 (parent data modifiers),用於通知父佈局其子項的特定要求。例如,若要匹配父 Box 的尺寸,請使用 matchParentSize 修飾符:

kotlin
@Composable
fun MatchParentSizeComposable() {
    Box {
        // 取得其父級 Box 的尺寸
        Spacer(
            Modifier
                .matchParentSize() 
                .background(Color.LightGray)
        )
        // 最大的子項,決定 Box 的尺寸
        Card()
    }
}

作用域修飾符的另一個範例是 weight,它可在 RowScopeColumnScope 內使用。它決定了可組合項相對於其同級元素應佔用的空間量:

kotlin
@Composable
fun Card() {
    Row(
        // 佔用其父級的全部寬度
        modifier = Modifier.fillMaxWidth() 
    ) {
        Image(
            /* 載入圖片的佔位符 */,
            // 分配 1f 的權重,以佔用可用空間的單一分數 
            modifier = Modifier.weight(1f) 
        )
        
        Column(
            // 分配 2f 的權重,其寬度是 Image 的兩倍
            modifier = Modifier.weight(2f)
        ) {
            // 欄位內的內容
        }
    }
}

提取與重用修飾符

當您將修飾符鏈接在一起時,您可以將該鏈提取為變數或函數以供重用。這提高了程式碼可讀性,並可透過重用修飾符實例來提升效能。

kotlin
val commonModifier = Modifier
    .padding(16.dp)
    .background(Color.LightGray)

@Composable
fun Example() {
    // 應用帶有邊距和背景顏色的可重用修飾符
    Text("Reusable modifier", modifier = commonModifier)

    // 為 Button 重用相同的修飾符
    Button(
        onClick = { /* Do something */ },
        modifier = commonModifier
    )
    {
        Text("Button with the same modifier")
    }
}

自訂修飾符

雖然 Compose Multiplatform 開箱即用提供了許多內建修飾符用於常見的使用案例,您也可以建立自己的自訂修飾符。

建立自訂修飾符有幾種方法:

下一步

Jetpack Compose 文件中了解更多關於修飾符的資訊。