【发布时间】:2020-09-23 15:23:29
【问题描述】:
我正在使用 Flow 从 Room 获取数据,然后我在 FragmentLogic 类中调用 Flow.collect。在collect{} 内部,我做了一些工作并通过接口更新视图(例如:view.updateAdapter(collectData))。这可以正常工作,直到调用 onConfigurationChanged 并且屏幕旋转,collect 中的代码在 Logcat 中执行和工作,但是任何改变 UI 的东西都不起作用,函数 updateAdapter() 被调用,但是没有任何反应。我发现的一种解决方案是在 onStart() 中再次调用函数 beginObservingProductList(),如果 savedinstance 不为空,但会创建两个 collect{} 实例,并且它们都显示在 logcat 中。
我希望 UI 更改即使在调用 onConfigurationChanged 后也能正常工作。
房间道类:
@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
}
}
【问题讨论】:
标签: android kotlin-coroutines kotlin-flow