如何在 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= 急切取消] 版本。应该没有任何明显的影响,但它的性能更高。
我遇到这样一种情况,一旦我得到 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= 急切取消] 版本。应该没有任何明显的影响,但它的性能更高。