【问题标题】:Kotlin Flow.collect executes but does not update ui onConfigurationChangedKotlin Flow.collect 执行但不更新 ui onConfigurationChanged
【发布时间】: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


    【解决方案1】:

    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
    })
    

    【讨论】:

      【解决方案2】:

      您应该按照 Google 的建议使用 repeatOnLifecycle。

      链接:https://developer.android.com/kotlin/flow/stateflow-and-sharedflow

      【讨论】:

      • 您应该在答案中包含代码本身,而不是添加图像。
      猜你喜欢
      • 2023-02-20
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      相关资源
      最近更新 更多