如何在 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++
    }
}