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

Room 驱动的MutableStateFlow无法更新,ViewModel部分代码未执行的问题求助

Room 驱动的MutableStateFlow无法更新,ViewModel部分代码未执行的问题求助

之前我用基于静态数据的Repository实现功能,一切都正常——在Composable里更新selectedCategory毫无问题,还能根据选中的分类和条目导航到完整路径。但切换到Room之后彻底乱套了:ViewModel里的部分代码好像完全没执行,控制台连日志都打不出来。

具体代码如下:

import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.droidcon.deeplinksnav.data.CategoryRepository
import com.droidcon.deeplinksnav.data.local.database.Category
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class CategoryViewModel @Inject constructor(
    private val categoryRepository: CategoryRepository
): ViewModel() {

    val uiState: StateFlow<CategoryUiState> = categoryRepository
        .categories.map<List<Category>, CategoryUiState>(CategoryUiState::Success)
        .catch { emit(CategoryUiState.Error(it)) }
        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), CategoryUiState.Loading)

    private val _selectedCategory = MutableStateFlow<Category?>(value = null)

    /**
     * Keeps track of the current selected category from the category grid
     */
    val selectedCategory: StateFlow<Category?>
        get() = _selectedCategory

    fun addCategory(category: Category) {
        viewModelScope.launch {
            categoryRepository.add(category)
        }
    }

    /**
     * Update the selected category to the category with the name [categoryName]
     */
    fun updateSelectedCategoryByName(categoryName: String) {
        viewModelScope.launch(Dispatchers.Main) {
            val search = categoryRepository.getCategoryByName(categoryName)
            Log.d("CategoryViewModel", "updateSelectedCategoryByName: Found category: ${search?.name}")
            search?.let{category->
                _selectedCategory.value = category
                //TODO: Fix needed
                selectedCategory.collect{
                    delay(500)
                    Log.d("CategoryViewModel", "updateSelectedCategoryByName: current selected category: ${selectedCategory.value?.name}")
                }
            }
        }
    }
}

sealed interface CategoryUiState {
    data object Loading : CategoryUiState
    data class Error(val throwable: Throwable) : CategoryUiState
    data class Success(val data: List<Category>) : CategoryUiState
}

遇到的问题:

  • selectedCategory始终无法更新,状态一直是null
  • updateSelectedCategoryByName方法里,selectedCategory.collect{}块内的日志完全没有输出
  • 即使提前调用了viewModel.updateSelectedCategoryByName(),在Composable中通过以下代码获取的值依然为null:
val selectedCategory by categoryViewModel.selectedCategory.collectAsStateWithLifecycle()

有没有大佬能帮忙分析下问题出在哪?感激不尽!

备注:内容来源于stack exchange,提问作者Mehdi Haghgoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:18:08