我正在制作自定义组件,我的自定义组件需要覆盖焦点状态。
在我的组件层次结构顶部,我使用以下代码跟踪焦点状态。
这个组件基本上就是这样的:
如果我将代码中的colorStuff保留并且没有focusModifier代码,那么焦点状态正确完成,并且组件的颜色相应地改变。但是当我添加focusModifier代码并添加边框和填充时,焦点状态会触发,但接着立即消失。我认为这是因为修改器代码的添加改变了组件的构建顺序,使其放弃了焦点状态。但这也不完全合理。
实质上,我需要在焦点状态下为组件添加边框/阴影效果,因此这将是我需要多次执行的操作。目前我无法做到一次性完成。您有任何想法如何克服这个问题吗?
在我的组件层次结构顶部,我使用以下代码跟踪焦点状态。
val focused = remember { mutableStateOf(false) }
val focusModifier = modifier.onFocusEvent {
focused.value = it.hasFocus || it.isFocused
}
Component(modifier = focusModifier, focused = focused.value)
这个组件基本上就是这样的:
@Composable
fun Component(
modifier: Modifier = Modifier,
focused: Boolean = false
) {
...
val colorStuff = if(focused) focusColors else otherColors
var focusModifier = modifier
if(focused) {
focusModifier = modifier.border(BorderStroke(2.dp, Color.Red)).padding(16.dp)
}
NextComponent(
focusModifier,
colorStuff,
etc
)
}
如果我将代码中的colorStuff保留并且没有focusModifier代码,那么焦点状态正确完成,并且组件的颜色相应地改变。但是当我添加focusModifier代码并添加边框和填充时,焦点状态会触发,但接着立即消失。我认为这是因为修改器代码的添加改变了组件的构建顺序,使其放弃了焦点状态。但这也不完全合理。
实质上,我需要在焦点状态下为组件添加边框/阴影效果,因此这将是我需要多次执行的操作。目前我无法做到一次性完成。您有任何想法如何克服这个问题吗?
Compose
中处理Focus Management
时遇到的问题。任何一个失去焦点的组件都会向焦点管理器报告其失去的状态。当您开始聚焦一个组件并移动到下一个组件时,FocusManager
将向您返回两个状态:一个失去焦点的组件和一个获得焦点的组件。我不知道您的用例是什么,但在我的情况下,我最终创建了一个具有唯一ID属性“isFocused:Boolean”的对象,以规避这些onFocusEvent{...}
报告。 - z.g.y