在 Jetpack Compose 中,如何检查屏幕是否已重新组合?

问题描述 投票:0回答:1

我希望能够在 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()
        }
    }
android kotlin android-jetpack-compose accessibility focus
1个回答
0
投票

您可以使用

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")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.