Android 待办事项增加事项统计

修改之前的待办事项demo,增加事项总数以及已完成数的统计。

1、ToDoDao中增加统计查询:

Kotlin 复制代码
@Query("SELECT COUNT(*) FROM todo_items")
fun getTotalCount(): Flow<Int>

@Query("SELECT COUNT(*) FROM todo_items WHERE isCompleted = 1")
fun getCompletedCount(): Flow<Int>

2、在TodoRepository 中暴露这些Flow:

Kotlin 复制代码
fun getTotalCount(): Flow<Int> = dao.getTotalCount()
fun getCompletedCount(): Flow<Int> = dao.getCompletedCount()

3、在ToDoViewModel中将其转化为StateFlow:

Kotlin 复制代码
// 统计信息
    private val _totalCount = MutableStateFlow(0)
    val totalCount: StateFlow<Int> = _totalCount.asStateFlow()

    private val _completedCount = MutableStateFlow(0)
    val completedCount: StateFlow<Int> = _completedCount.asStateFlow()

    init {
        viewModelScope.launch {
            repository.getTotalCount().collect { count ->
                _totalCount.value = count
            }
        }
        viewModelScope.launch {
            repository.getCompletedCount().collect { count ->
                _completedCount.value = count
            }
        }
    }

4、将统计信息显示到composeUI中:

运行:

ok. 而且当数据有变化时,统计也会自动更新。

注意,当前代码repository.getTotalCount() 返回的是 Flow<Int>(冷流),可以持续收集更新。但如果改成从服务端获取数据,返回的是一次性的结果(如 suspend fun getTotalCount(): Int),不是 Flow,不能调用 .collect。初始化改成这样:

Kotlin 复制代码
init {
    viewModelScope.launch {
        _totalCount.value = repository.getTotalCount()
    }
    viewModelScope.launch {
        _completedCount.value = repository.getCompletedCount()
    }
}

然后当有数据变化,需要主动查询,刷新统计信息,如:

Kotlin 复制代码
fun addTodo(title: String) {
    viewModelScope.launch {
        repository.addTodo(title)
        refreshStatistics()  // 手动刷新统计
    }
}

private suspend fun refreshStatistics() {
    _totalCount.value = repository.getTotalCount()
    _completedCount.value = repository.getCompletedCount()
}
相关推荐
骑着蜗牛撵大象3278 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
hunterandroid8 小时前
Retrofit 网络请求的异常处理与重试策略实战
android
sejinan9 小时前
极致轻量与秒级起播:NativeWasmTv 开源硬核技术解析与升级版体验
android·开源·webview·tv
小羊没烦恼!9 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
mmsx9 小时前
Android 静默失败实录:五个没有日志的线上事故
android·kotlin
hai_android10 小时前
从零实现一个支持跨进程(IPC)的自定义 Toast
android·kotlin·android jetpack
龙腾-虎跃10 小时前
基于 SIP 协议的自研电话终端:FreeSWITCH 语音与视频通信实战
android·音视频·freeswitch·sip协议终端·wertc
imDwAaY10 小时前
操作系统如何管理程序运行?从线程、进程到内存隔离与用户态切换:CS162 Note2
android·java·redis
andyweike11 小时前
Android文件系统
android
studyForMokey11 小时前
【Android 面试】Paging3
android·面试·职场和发展