每當焦點在組合樹狀結構中變更時,Compose 就會觸發焦點事件,供父項和子項修飾符觀察。您可以使用 onFocusChanged 修飾符監聽焦點狀態轉換、查詢目前的焦點屬性,以及觸發狀態驅動的 UI 更新。
使用 onFocusChanged 觀察焦點狀態
每當元素獲得或失去焦點時,onFocusChanged 修飾符就會提供 FocusState 物件。
舉例來說,您可以觀察焦點變化,更新自訂元件狀態 (例如變更元素的邊框顏色或觸發動畫):
var color by remember { mutableStateOf(Color.White) } Card( modifier = Modifier .onFocusChanged { color = if (it.isFocused) Red else White } .border(5.dp, color) ) {}
在本例中,remember 會在重組期間儲存邊框顏色,且每當元素焦點狀態轉換時,邊框顏色就會更新。
FocusState 屬性
傳遞至 onFocusChanged 的 FocusState 物件提供三個主要屬性:
isFocused:如果這個修飾符附加的特定可組合項目前持有有效輸入焦點,則傳回true。hasFocus:如果這個可組合函式或任何子項可組合函式目前有焦點,則傳回true。這對需要瞭解其中任何子項何時處於有效狀態的父項容器 (例如資訊卡或工具列) 很有用。isCaptured:如果焦點目前鎖定在元素上 (例如使用captureFocus()進行強制回應子互動時),則會傳回true。擷取焦點時,嘗試將焦點移至其他元素不會清除焦點。
Modifier.onFocusChanged { focusState ->
val isFocused = focusState.isFocused
val hasFocus = focusState.hasFocus
val isCaptured = focusState.isCaptured
}