如何在 Jetpack Compose 中以可移植的方式实现计时器?
How can I implement a timer in a portable way in Jetpack Compose?
我想写一些应用程序,我希望某些事情按计划发生。
每隔几分钟轮询一次 URL 更新似乎是一个相当常见的用例。不过,在这种特殊情况下,我只是想实现一个时钟。
这个有效:
@Composable
fun App() {
var ticks by remember { mutableStateOf(0) }
// Not 100% happy about this unused variable either
val timer = remember {
Timer().apply {
val task = object : TimerTask() {
override fun run() {
ticks++
}
}
scheduleAtFixedRate(task, 1000L, 1000L)
}
}
MaterialTheme {
Text(
// A real application would format this number properly,
// but that's a different question
text = "$ticks"
)
}
}
但我必须导入 java.util.Timer
,所以它不能移植。
Jetpack Compose 可以做动画,所以它肯定有自己的定时器某处,这意味着应该有一些可移植的方法来做这个,但我似乎做不到搞清楚。
是否有跨平台的方法来获取用于此目的的计时器?
在 Compose 中你可以使用 LaunchedEffect
- 这是协程作用域上 运行 的副作用,所以你可以在里面使用 delay
,像这样:
var ticks by remember { mutableStateOf(0) }
LaunchedEffect(Unit) {
while(true) {
delay(1.seconds)
ticks++
}
}
我想写一些应用程序,我希望某些事情按计划发生。
每隔几分钟轮询一次 URL 更新似乎是一个相当常见的用例。不过,在这种特殊情况下,我只是想实现一个时钟。
这个有效:
@Composable
fun App() {
var ticks by remember { mutableStateOf(0) }
// Not 100% happy about this unused variable either
val timer = remember {
Timer().apply {
val task = object : TimerTask() {
override fun run() {
ticks++
}
}
scheduleAtFixedRate(task, 1000L, 1000L)
}
}
MaterialTheme {
Text(
// A real application would format this number properly,
// but that's a different question
text = "$ticks"
)
}
}
但我必须导入 java.util.Timer
,所以它不能移植。
Jetpack Compose 可以做动画,所以它肯定有自己的定时器某处,这意味着应该有一些可移植的方法来做这个,但我似乎做不到搞清楚。
是否有跨平台的方法来获取用于此目的的计时器?
在 Compose 中你可以使用 LaunchedEffect
- 这是协程作用域上 运行 的副作用,所以你可以在里面使用 delay
,像这样:
var ticks by remember { mutableStateOf(0) }
LaunchedEffect(Unit) {
while(true) {
delay(1.seconds)
ticks++
}
}