如何使用 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
}
}
我知道从架构上讲这绝对不是一件好事,但我在可组合项中嵌入了一个 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
}
}