喷气背包中的CountDownTimer组成



我正在测试jetpack中的CountDownTimer,并使用以下代码

@Composable
fun Timer() {
val millisInFuture: Long = 10 * 1000 // TODO: get actual value
val timeData = remember {
mutableStateOf(millisInFuture)
}
val countDownTimer =
object : CountDownTimer(millisInFuture, 1000) {
override fun onTick(millisUntilFinished: Long) {
Log.d("TAG", "onTick: ")
timeData.value = millisInFuture
}
override fun onFinish() {

}
}

DisposableEffect(key1 = "key") {
countDownTimer.start()
onDispose {
countDownTimer.cancel()
}
}
Text(
text = timeData.value.toString()
)
}

在logcat中,我可以看到计时器在滴答作响,但UI没有更新。请解释为什么在改变状态变量的值时会有重新组合。

简单的CountDownTimer仅用于第二个

var timer by remember { mutableStateOf(durationSeconds) }
LaunchedEffect(key1 = timer) {
if (timer > 0) {
delay(1_000)
timer -= 1
}
}

Text(
text = timer.toString()
) 

您可以尝试使用以下代码来实现倒计时计时器:

val time = (timerDate.time).minus(Calendar.getInstance().timeInMillis)
var timer by remember { mutableStateOf(time) }
LaunchedEffect(key1 = timer) {
if (timer > 0) {
delay(1000L)
timer -= 1000L
}
}
val secMilSec: Long = 1000
val minMilSec = 60 * secMilSec
val hourMilSec = 60 * minMilSec
val dayMilSec = 24 * hourMilSec
val hours = (time % dayMilSec / hourMilSec).toInt()
val minutes = (time % dayMilSec % hourMilSec / minMilSec).toInt()
val seconds = (time % dayMilSec % hourMilSec % minMilSec / secMilSec).toInt()
Text(text = String.format("%02d:%02d:%02d", hours, minutes, seconds))

好吧,在CountDownTimer中,你应该设置millisUntilFinished,而不是设置millisInFuture。该变量保存更新后的值,即millisInFuture永远不会更改

timeData.value = millisUntilFinished

只有当可组合函数参数或可组合内部State<T>的值发生变化(如mutableStateOf()mutableStateListOf()(时,才可组合。在您的情况下,您还没有启动countDownTimer本身。尝试在DisposableEffect中调用countDownTimer.start()。其次,您将timeData设置为错误的值,尝试使用millisUntilFinished进行设置

最新更新