0

假设我有一个显示/animals动物列表的 API 资源,我们称之为/animals/{species}两个单独PagingSource的对象?用于分页的Codelab有一个扩展PagingSource名为的类GithubPagingSource,但它仅用于一个端点。我想知道正确的方法是什么。

4

1 回答 1

1

PagingSource 的单个实例应该代表支持数据集的快照,这基本上意味着如果一个页面被同一个实例删除并重新加载,则应该输出同一个页面。

但是,您可以拥有一个实现并创建它的多个实例,因此可能会推荐这样的方法:

class AnimalPagingSource(val species: String?): PagingSource<..> {
    override suspend fun load(...): LoadResult<..> {
        val result = if (species != null) {
            return networkApi.getSpecies(species)
        } else {
            return networkApi.getAnimals()
        }

        return LoadResult.Page(result.data, ...)
    }
}

稍后当您需要使用由此产生的 Flow<PagingData<..>> 时,您可以在多个 Pager 之间切换:

speciesFlow
    .flatMapLatest { species ->
        Pager(...) { AnimalPagingSource(species) }.flow
    }
    .cachedIn(scope)
    .collectLatest { pagingData ->
        adapter.submitData(pagingData)
    }
于 2020-08-06T04:30:52.030 回答