我知道在架构上这绝对不是一件好事,但我已经嵌入了一个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。
下面的问题:为什么我的可组合不重新组合上改变值的MutableState的HashMap?看起来确实很相似,但我不确定它在这里如何适用。在我看来,我正在更新文本值为I !
###你不应该直接从可组合视图构建器中改变视图状态,因为组合函数会在重组过程中经常被召回,所以你的计算会重复。你应该用副作用来代替。
如果你需要向用户显示值的动态变化,那么你应该使用动画,正如Gabriele的回答所建议的那样。
另一个选项是手动更新值。在launchedeeffect内部,你可以使用suspend函数,这样你就可以用需要的延迟来改变值:
LaunchedEffect(Unit) {
for (i in 1..100) {
delay(1000) // update once a second
text = i
}
}
###你应该使用一个动画来定义你想要多久更新的文本应用它的副作用。
例如:
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
}