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