You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android Compose中从ViewModel观察当前时间的最轻量实现方案是什么?

轻量实现:Composable实时显示当前时间(ViewModel驱动)

ViewModel 实现

用StateFlow暴露格式化后的时间,借助viewModelScope管理定时任务生命周期,页面销毁时自动停止协程,避免资源浪费。

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import java.time.LocalTime
import java.time.format.DateTimeFormatter

class ClockViewModel : ViewModel() {
    // 定义HH:mm格式的时间格式化器
    private val timeFormatter = DateTimeFormatter.ofPattern("HH:mm")
    
    // 内部可变流,对外暴露只读版本
    private val _currentTime = MutableStateFlow(getFormattedTime())
    val currentTime: StateFlow<String> = _currentTime

    init {
        // 启动每秒更新时间的协程
        viewModelScope.launch {
            while (true) {
                delay(1000)
                _currentTime.value = getFormattedTime()
            }
        }
    }

    // 获取并格式化当前时间
    private fun getFormattedTime(): String {
        return LocalTime.now().format(timeFormatter)
    }
}

Composable 视图实现

用collectAsStateWithLifecycle观察ViewModel的StateFlow,这是Compose中生命周期安全的观察方式,页面不可见时自动暂停收集,减少无效更新。

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsStateWithLifecycle
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontSize
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun ClockScreen() {
    val viewModel: ClockViewModel = viewModel()
    // 收集时间流的最新值
    val currentTime = viewModel.currentTime.collectAsStateWithLifecycle()

    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(
            text = currentTime.value,
            fontSize = FontSize(48.sp)
        )
    }
}

轻量特性说明

  • 依赖极简:仅使用Jetpack ViewModel、kotlinx.coroutines和Compose核心库,无额外第三方依赖
  • 生命周期安全:viewModelScope自动处理协程销毁,collectAsStateWithLifecycle适配页面生命周期
  • 代码简洁:核心逻辑仅几十行,无冗余封装或复杂状态管理

内容的提问来源于stack exchange,提问作者F.Mysir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:36:35