我知道在架构上这绝对不是一件好事,但我已经在可组合的更新状态中嵌入了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。
下面的问题:Why my composable not recomposing on changing value for MutableState of HashMap?,看起来很相似,但我不确定它在这里是如何应用的。在我看来,我正在将文本值更新为i!
发布于 2021-09-18 05:54:16
您不应该直接从可组合视图构建器更改视图状态,因为组合函数将在重新组合过程中经常被调用,因此您的计算将重复。您应该改用side effects。
如果您需要向用户显示值的动态变化,那么您应该使用动画,正如Gabriele的答案所建议的那样。
另一种选择是手动更新值。在LaunchedEffect中,您可以使用挂起函数,因此可以在需要的延迟时间内更改该值:
LaunchedEffect(Unit) {
for (i in 1..100) {
delay(1000) // update once a second
text = i
}
}发布于 2021-09-18 05:24:53
您应该使用动画来定义更新文本的频率,并将其应用于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
}

https://stackoverflow.com/questions/69230364
复制相似问题