如果初始值更改则重置 mutableStateOf - Jetpack Compose

use*_*297 7 android kotlin android-jetpack-compose

我是 Jetpack Compose 的新手,我刚刚开始通过创建计时器应用程序来尝试它,但遇到了问题。

在我的应用程序中,每个任务都有不同的持续时间,其中一项任务完成(时间已过)后,下一项任务应该开始。我的问题是我的应用程序仅适用于第一个任务。第一个任务完成后,应显示第二个任务,任务标题和描述会更改,但计时器的倒计时值仍为 0,不会从之前的状态更新。

onFinished调用视图模型的方法之一,该方法将获取应显示的下一个任务并将其加载到实时数据中我通过以下方式观察此实时数据的变化:

val 任务 = viewModel.currentTask.observeAsState().value

此任务有一个持续时间字段,我将其传递给此Timer可组合项,但当更新此任务时(因为实时数据具有新值),Timer 可组合项无法识别这些更改。它不会重新开始倒计时,而是保持 0。

我不确定我是否正确理解和使用 MutableState 概念,所以有人可以帮助我吗?

@Composable
fun Timer(duration: Long, onFinished: () -> Unit) {
    var currentTimerValue by remember { mutableStateOf(duration) }
    LaunchedEffect(key1 = currentTimerValue) {
        if (currentTimerValue > 0) {
            delay(1000L)
            currentTimerValue--
        } else {
            onFinished.invoke()
        }
    }

    Text(text = currentTimerValue.toString(), fontSize = 24.sp, color = Color.White)
}
Run Code Online (Sandbox Code Playgroud)

Thr*_*ian 10

问题就在这里

var currentTimerValue by remember { mutableStateOf(duration) }
Run Code Online (Sandbox Code Playgroud)

计时器可组合进入组合后,记忆中的块将被初始化,并且除非您使用新密钥重置它,否则它不会更改。

您可以将其更新为

var currentTimerValue by remember(duration) { mutableStateOf(duration) }
Run Code Online (Sandbox Code Playgroud)

每次计时器功能的持续时间参数发生变化时,都会重置为持续时间