首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用For循环更新使我的Composable Recompose?

如何使用For循环更新使我的Composable Recompose?
EN

Stack Overflow用户
提问于 2021-09-17 23:16:43
回答 2查看 365关注 0票数 0

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

代码语言:javascript
复制
@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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-18 05:54:16

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

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

另一种选择是手动更新值。在LaunchedEffect中,您可以使用挂起函数,因此可以在需要的延迟时间内更改该值:

代码语言:javascript
复制
LaunchedEffect(Unit) {
    for (i in 1..100) {
        delay(1000) // update once a second
        text = i
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-09-18 05:24:53

您应该使用动画来定义更新文本的频率,并将其应用于side effect

例如:

代码语言:javascript
复制
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
}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69230364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档