为不同的 API 资源创建另一个 PagingSource?

Creating another PagingSource for a different API resource?

假设我有一个显示动物列表的 API 资源,我们称它为 /animals,并且我有另一个用于使用物种搜索动物列表的资源,/animals/{species},如果我要使用 Android 的新 Paging3 库,我是否必须为它们创建两个单独的 PagingSource 对象?用于分页的 Codelab 有一个扩展 PagingSource 的 class,称为 GithubPagingSource,但它仅用于一个端点。我想知道正确的方法是什么。

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>时,可以在多个Pagers之间切换:

speciesFlow
    .flatMapLatest { species ->
        Pager(...) { AnimalPagingSource(species) }.flow
    }
    .cachedIn(scope)
    .collectLatest { pagingData ->
        adapter.submitData(pagingData)
    }