如何解决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
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。