如何使用 For 循环更新进行可组合重组?

How can I make my Composable Recompose with a For Loop Update?

我知道从架构上讲这绝对不是一件好事,但我在可组合项中嵌入了一个 for 循环来更新状态,如下所示:

@Composable
fun WorkScreen(name: String?) {
    var text by remember {
        mutableStateOf(0)
    }

    Box(
        contentAlignment = Alignment.Center,
        modifier = Modifier.fillMaxSize()
    ) {
        Text(text = "YOU PRESSED ME $text")
    }
    for (i in 1..100) {
        text = i
    }
}

我的期望是,当我切换到此屏幕时,for 循环应该更新 mutableState 并因此导致重新组合,从而导致时间滴答作响。但是,如果我将 for 循环放在 Box 函数下面,我只会得到 YOU PRESSED ME 0,或者如果我把它放在 Box 函数上面,我会得到 YOU PRESSED ME 100

下面的问题:,看起来确实很相似,但我不确定它在这里如何应用。在我看来,我正在将文本值更新为 i!

您应该使用一个动画,您可以在其中定义要更新文本的频率 side effect

例如:

var targetValue by remember { mutableStateOf(0) }
val value by animateIntAsState(
    targetValue = targetValue,
    animationSpec = tween( durationMillis = 2000 )
)

Box(
    contentAlignment = Alignment.Center,
    modifier = Modifier.fillMaxSize()
) {
    Text(text = "YOU PRESSED ME $value")
}

LaunchedEffect(Unit) {
    targetValue = 100
}

您不应该直接从可组合视图生成器更改视图状态,因为在重组过程中会经常调用组合函数,因此您的计算会重复。您应该改用 side effects

如果您需要向用户显示值的动态变化,那么您应该使用动画,正如 Gabriele 的回答所建议的那样。

另一个选项是手动更新值。在 LaunchedEffect 中,您可以使用挂起函数,因此您可以根据需要延迟更改值:

LaunchedEffect(Unit) {
    for (i in 1..100) {
        delay(1000) // update once a second
        text = i
    }
}