回应焦点

每当焦点在整个组合树中发生变化时,Compose 都会触发一个焦点事件,父级和子级修饰符可以观察到该事件。您可以使用 onFocusChanged 修饰符来监听焦点状态转换、查询当前焦点属性,以及触发由状态驱动的界面更新。

使用 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
}