Kotlin Flow.collect 执行但不更新 ui onConfigurationChanged
Kotlin Flow.collect executes but does not update ui onConfigurationChanged
我正在使用 Flow
从 Room 获取数据,然后在我的 FragmentLogic class 中调用 Flow.collect
。在 collect{}
中,我做了一些工作并通过接口更新视图(示例:view.updateAdapter(collectData)
)。这工作正常,直到调用 onConfigurationChanged
并且屏幕旋转,collect 中的代码在 Logcat 中执行和工作,但是任何改变 UI 的东西都不起作用,函数 updateAdapter()
被调用但是没有任何反应。我发现的一种解决方案是在 onStart()
中再次调用函数 beginObservingProductList()
如果 savedinstance 不为 null 但创建了 collect{} 的两个实例并且它们都显示在 logcat.
我希望 UI 更改即使在 onConfigurationChanged
被调用后也能正常工作。
房道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()
Activity/Fragment
viewModel.liveData.observe(this,Observer{ list->
//do your thing
})
我正在使用 Flow
从 Room 获取数据,然后在我的 FragmentLogic class 中调用 Flow.collect
。在 collect{}
中,我做了一些工作并通过接口更新视图(示例:view.updateAdapter(collectData)
)。这工作正常,直到调用 onConfigurationChanged
并且屏幕旋转,collect 中的代码在 Logcat 中执行和工作,但是任何改变 UI 的东西都不起作用,函数 updateAdapter()
被调用但是没有任何反应。我发现的一种解决方案是在 onStart()
中再次调用函数 beginObservingProductList()
如果 savedinstance 不为 null 但创建了 collect{} 的两个实例并且它们都显示在 logcat.
我希望 UI 更改即使在 onConfigurationChanged
被调用后也能正常工作。
房道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()
Activity/Fragment
viewModel.liveData.observe(this,Observer{ list->
//do your thing
})