我正在用下面的代码在jetpack compose中试验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没有更新。请解释为什么在改变状态变量的值时没有重组。
4条答案
按热度按时间3yhwsihp1#
你可以尝试用下面的代码来实现一个倒计时计时器:
qvk1mo1f2#
在CountDownTimer中,您应该设置millisUntilFinished,而不是设置millisInFuture。该变量保存更新后的值,millisInFuture永远不会更改
bttbmeg03#
Composable仅在状态发生变化时才重新组合,无论是来自Composable函数参数还是由Composable本身内部的
State<T>
的值变化(如mutableStateOf()
或mutableStateListOf()
)。在本例中,您还没有启动countDownTimer
本身。尝试在DisposableEffect
内部调用countDownTimer.start()
。第二,您使用错误的值设置timeData,尝试使用millisUntilFinished
设置它kqhtkvqz4#
简单的CountDownTimer只是秒