修改之前的待办事项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()
}