【问题标题】:How can I make my Composable Recompose with a For Loop Update?如何使用 For 循环更新进行可组合重组?
【发布时间】:2021-09-17 23:16:42
【问题描述】:

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

【问题讨论】:

  • 我认为结果应该是“你按了我 100 分”。
  • 您希望文本多久更新一次?一秒钟一次?一毫秒一次?瞬间?
  • @MARSK 否,一种情况是 0,另一种情况是 100。
  • @ianhanniballake 理想情况下,我希望每秒一次!

标签: android kotlin android-jetpack-compose android-jetpack


【解决方案1】:

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

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

另一个选项是手动更新值。在LaunchedEffect 内部,您可以使用挂起函数,因此您可以根据需要更改值:

LaunchedEffect(Unit) {
    for (i in 1..100) {
        delay(1000) // update once a second
        text = i
    }
}

【讨论】:

  • 好的,所以启动效果选项基本上只是一种在可组合对象内显示动画到某个值的方式?
  • @Connor 这只是一种改变状态的方式,它并没有真正为任何东西设置动画
  • 我建议您访问他在答案中提到的side-effects 的链接。它会解释一切。
  • 如果您还没有,也可以选择state codelab
  • @Connor 您可以使用LaunchedEffect 与应用程序的其他部分进行交互。我同意 MARSK 的观点,您应该查看文档以了解详细信息
【解决方案2】:

您应该使用动画,在其中定义要更新文本的频率,并使用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
}

【讨论】:

  • 谢谢!你能向我解释为什么我正在做的事情不起作用吗?
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多