android 数据存储区-流no在更改后发出新值

ff29svar  于 2023-05-21  发布在  Android
关注(0)|答案(1)|浏览(159)

我无法接收数据存储中的更改。在主屏幕上的设置中更改数据库模式后,应用程序应观察另一个数据源。

@Singleton
class SettingsRepositoryImpl @Inject constructor(
    @ApplicationContext private val context: Context
) : SettingsRepository {
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")

 override val databaseMode: Flow<String>
        get() =
            context.dataStore.data.map { preferences ->
                preferences[DATABASE_MODE_KEY] ?: DatabaseMode.LOCAL.name
            }.distinctUntilChanged()

/// Viewmodel ->
viewModelScope.launch(Dispatchers.Default) {
            observeDatabaseModeUseCase().collect { databaseMode ->
                observeAllProductsUseCase(databaseMode).map { products ->
                    getFilteredProductListUseCase(
                        products,
                        filterProductDataState.value.filterProduct
                    )
                }.collect {
                    _uiState.value = MyPantryProductsUiState.Loaded(
                        MyPantryModel(
                            groupsProduct = getGroupProductListUseCase(it),
                            loadingVisible = false
                        )
                    )
                }
            }
        }

我试过所有的调度员。我不知道为什么它没有发出新值

rlcwz9us

rlcwz9us1#

您正在另一个流的收集块中收集一个无限流。因此,当外部流中的第一个项被发射时,它将永远开始收集内部流,而外部流中的第二个项永远不会被发射。使用flatMapLatest代替。这将使它在第一个流发出新项时中断第二个流。

//In ViewModel init:
observeDatabaseModeUseCase()
    .flatMapLatest { databaseMode ->
        observeAllProductsUseCase(databaseMode)
    }.map { products ->
        getFilteredProductListUseCase(
            products,
            filterProductDataState.value.filterProduct
        )
    }.onEach {
        _uiState.value = MyPantryProductsUiState.Loaded(
            MyPantryModel(
                groupsProduct = getGroupProductListUseCase(it),
                loadingVisible = false
            )
        )
    }
    .flowOn(Dispatchers.Default) // probably unnecessary since you don't seem to be doing blocking work.
    .launchIn(viewModelScope)

您没有显示_uiState是什么,但您可以使用上面的stateIn将其变为StateFlow以简化代码。

相关问题