每当焦点在整个组合树中发生变化时,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
}