如何在 UI 中将 PagingData<T> 转换为 collectLatest() 中的模型

How to transform PagingData<T> into model in collectLatest() in UI

我遇到这样一种情况,一旦我得到 pagingData <T: UIModel>,我需要从另一个 API 获取额外的数据。第二个 Api requires 参数存在于第一个 API 响应中。目前我在 UI 层收集 lifecyclescope as,

            loadResults().collectLatest {

                PagingResultAdapter.submitData(lifecycle, it)
               
                // Extracting the data inside PagingData and setting in viewmodel.
                it.map { uiModel -> 
                    Timber.e("Getting data inside map function..")
                    viewModel.setFinalResults(uiModel)
                }
            }
        }

但问题是,pagingData 上的map{} 函数在数据获取 期间不会运行。列表已填充,ui 正在 recyclerview 中显示项目。但是地图功能不是运行ning..(我看不到日志)

UI层loadResults()函数依次调用viewmodel.loadResults()层变量UI。在分页方面一切正常,但我无法将分页数据转换为任何层中的 UIModel。 官网建议只使用map{}函数。

https://developer.android.com/topic/libraries/architecture/paging/v3-transform#basic-transformations

B但我不知道我应该应用哪一层map{}以及收集之前或之后..任何帮助都是好的..

PagingData.map 是一个惰性转换,当您调用 .submitData(pagingData) 时,它会在收集期间 运行s。由于您只提交原始 un-transformed PagingData 您的 .map 转换永远不会 运行.

您应该将 .map 应用到 PagingData 您实际上最终会提交的 运行。通常这是从 ViewModel 完成的,因此结果也会被缓存,以防您最终进入配置更改或缓存场景(例如在片段之间导航时)。

您没有共享您的 ViewModel/您正在创建寻呼机的地方,但假设这发生在不同的层,您会得到类似的东西:

MyViewModel.kt

fun loadResults() = Pager(...) { ... }
  .map {
    Timber.e("Getting data inside map function..")
    setFinalResults(uiModel)
    it
  }
  .cachedIn(viewModelScope)

MyUi.kt

viewModel.loadResults().collectLatest {
  pagingDataAdapter.submitData(it)
}

注意:您应该使用 .submitData 的挂起版本,因为您使用的是 Flow / Coroutines,因为它能够传播取消方向,而不是依赖于启动的作业 + 通过 [=33= 急切取消] 版本。应该没有任何明显的影响,但它的性能更高。