我如何使我的可组合重组与循环更新?

我知道在架构上这绝对不是一件好事,但我已经嵌入了一个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
}
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码