[英]Kotlin Flow.collect executes but does not update ui onConfigurationChanged
我正在使用Flow
从 Room 获取数据,然后在我的 FragmentLogic class 中调用Flow.collect
。在collect{}
内部我做了一些工作并通过接口更新视图(示例: view.updateAdapter(collectData)
)。 这在调用onConfigurationChanged
并且屏幕旋转之前工作正常,collect 中的代码在 Logcat 中执行并工作,但任何更改 UI 的内容都不起作用,function updateAdapter()
被调用但没有任何反应。 我发现的一种解决方案是在onStart()
) 中再次调用 function beginObservingProductList()
) 如果 savedinstance 不是 null 而是创建 collect{} 的两个实例并且它们都显示在 logcat 中。
我希望即使在onConfigurationChanged
后 UI 更改也能正常工作。
房道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()
活动/片段
viewModel.liveData.observe(this,Observer{ list->
//do your thing
})
您应该按照 Google 的建议使用 repeatOnLifecycle 。
链接: https : //developer.android.com/kotlin/flow/stateflow-and-sharedflow
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.