问题描述
我正在使用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
})