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

问题描述

我正在使用Flow从Room中获取数据,然后在FragmentLogic类中调用Flow.collect。在collect{}内部,我做了一些工作,并通过一个界面(例如:view.updateAdapter(collectData))更新了视图。在调用onConfigurationChanged并旋转屏幕之前,它可以正常工作,并且内部的代码可以在Logcat中执行并运行,但是任何更改UI的方法均不起作用,调用函数updateAdapter()却没有任何反应。我发现的一种解决方案是,如果savedinstance不为null,但会在beginobservingProductList()中再次调用函数onStart(),但这会创建collect {}的两个实例,它们都显示在logcat中。

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

房间道课:

@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
    }
}

解决方法

流程不支持生命周期,您应该使用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())

ViewModel

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

活动/片段

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

//do your thing
})