Создаете еще один PagingSource для другого ресурса API? - PullRequest
0 голосов
/ 06 августа 2020

Предположим, у меня есть ресурс API, который отображает список животных, назовем его /animals, и у меня есть еще один ресурс, который используется для поиска в списке животных по их виду, /animals/{species}, если бы я использовал Android новая библиотека Paging3, нужно ли мне создавать для них два отдельных объекта PagingSource? Codelab для разбиения на страницы имеет один класс, расширяющий PagingSource, называемый GithubPagingSource, но он предназначен только для одной конечной точки. Мне было интересно, какой будет правильный подход.

1 Ответ

1 голос
/ 06 августа 2020

Предполагается, что один экземпляр 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 > Таким образом, вы можете переключаться между несколькими пейджерами:

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