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始终无法更新,状态一直是nullupdateSelectedCategoryByName方法里,selectedCategory.collect{}块内的日志完全没有输出- 即使提前调用了
viewModel.updateSelectedCategoryByName(),在Composable中通过以下代码获取的值依然为null:
val selectedCategory by categoryViewModel.selectedCategory.collectAsStateWithLifecycle()
有没有大佬能帮忙分析下问题出在哪?感激不尽!
备注:内容来源于stack exchange,提问作者Mehdi Haghgoo
相关产品推荐
相关产品推荐

