我使用Flow从房间中获取数据,然后在我的FragmentLogic类中调用Flow.collect。在collect{}内部,我做了一些工作,并通过一个接口(例如:view.updateAdapter(collectData))更新视图。这很好用,直到调用onConfigurationChanged和屏幕旋转,collect中的代码在Logcat中执行和工作,但是任何改变UI的东西都不起作用,函数updateAdapter()被调用,但是没有发生任何事情。我发现的一种解决方案是,如果onStart()实例不为空,则在savedinstance中再次调用函数beginObservingProductList(),但这会创建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
}
}发布于 2020-09-25 21:02:38
Flow不是生命周期感知的,您应该使用LiveData来处理配置更改。
要在Flow中使用LiveData,请实现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
})发布于 2021-10-29 08:59:46
你应该按照谷歌的建议使用repeatOnLifecycle。

链接:https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
https://stackoverflow.com/questions/64031225
复制相似问题