我希望能够在 Text 对象上设置可访问性焦点,但只有在它变得可见时(通过记住的可变状态布尔值)。这意味着屏幕需要先完成重新合成,然后我们才能对其进行任何其他操作。
我的代码设置如下:
var isVisible by remember { mutableStateOf(false) }
var focusRequester = remember { FocusRequester() }
if (isVisible) {
Text(text = "Text", modifier = Modifier
.focusRequester(focusRequester)
.focusable())
focusRequester.requestFocus()
}
Button(onClick = { isVisible = true }) {
Text(text = "Make text appear and focused")
}
当我们到达
focusRequester.requestFocus()
时,此操作会失败,因为文本对象在屏幕上尚未可见。
有没有办法检查屏幕是否已重新构图?这样我就可以做这样的事情:
if (isVisible) {
Text(text = "Text", modifier = Modifier
.focusRequester(focusRequester)
.focusable())
if (isRecomposed) {
focusRequester.requestFocus()
}
}
您可以使用
LaunchedEffect
,当您的 Compoable 进入组合时,它会触发其块。
@Preview
@Composable
private fun RecompositionSample() {
var isVisible by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
Column {
if (isVisible) {
Text(
text = "Text",
modifier = Modifier
.focusRequester(focusRequester)
.focusable(true)
)
LaunchedEffect(Unit) {
awaitFrame()
focusRequester.requestFocus()
}
}
Button(onClick = { isVisible = true }) {
Text(text = "Make text appear and focused")
}
}
}