Kotlin Flow.collect 执行但不更新 ui onConfigurationChanged

Kotlin Flow.collect executes but does not update ui onConfigurationChanged

我正在使用 Flow 从 Room 获取数据,然后在我的 FragmentLogic class 中调用 Flow.collect。在 collect{} 中,我做了一些工作并通过接口更新视图(示例:view.updateAdapter(collectData))。这工作正常,直到调用 onConfigurationChanged 并且屏幕旋转,collect 中的代码在 Logcat 中执行和工作,但是任何改变 UI 的东西都不起作用,函数 updateAdapter() 被调用但是没有任何反应。我发现的一种解决方案是在 onStart() 中再次调用函数 beginObservingProductList() 如果 savedinstance 不为 null 但创建了 collect{} 的两个实例并且它们都显示在 logcat.

我希望 UI 更改即使在 onConfigurationChanged 被调用后也能正常工作。

房道class:

@Query("SELECT * FROM product")
fun observableList(): Flow<List<ProductEntity>>

然后在执行中:

 productDao.observableList().map { collection ->
            collection.map { entity ->
                entity.toProduct
            }
 }.flowOn(DispatchThread.io())

最后我收集数据并更改视图:

 private fun beginObservingProductList() = this.launch {
    vModel.liveProductList.map {
        mapToSelectionProduct(it)
 }.collect {
        ui { view.updateAdapter(it) }
        if (it.isNotEmpty()) {
            filledListState()
     } else {
            emptyListState()
     }
        updateCosts()
        vModel.firstTime = false
    }
}

Flow 不支持生命周期,您应该使用 LiveData 来处理配置更改。

要将 LiveData 与 Flow 结合使用, 实施 androidx.lifecycle:lifecycle-livedata-ktx:2.2.0,然后您可以使用 .asLiveData() 扩展功能。

存储库

fun getList()= productDao.observableList().map { collection ->
        collection.map { entity ->
            entity.toProduct
        }
}.flowOn(DispatchThread.io())

视图模型

val liveData = repository.getList().asLiveData()

Activity/Fragment

 viewModel.liveData.observe(this,Observer{ list->

//do your thing
})