Всем привет после такого длительного перерыва возвращаем серию статей Boilerplate. Сегодня будем разбирать как облегчить пагинацию с помощью библиотеки Paging 3. За это время достаточно правок произошло в самом репозитории Boilerplate которые мы сегодня тоже разберем.  Ссылки на предыдущие статьи чтобы понимать что здесь происходит: Single Activity с Navigation component. Или как я мучался с графами Запросы в сеть с Clean Architecture и MVVM Запросы в сеть с Clean Architecture – Обработка ошибок с сервера Мы не будем смотреть как работает библиотека Paging 3, а разберем как облегчить работу с ней. По этой причине вы должны обладать базовой информацией по этой библиотеке. Сначала пойдем от слоя domain. Пропишем в нем наши сущности, запросы и сценарии использования. Далее нам нужно затянуть Paging 3 в слой domain чтобы у нас был доступ к классу PagingData к которому мы будем обращаться в Repository. Спорный момент - библиотека от Android то есть мы зависим от платформы, у него конечно есть альтернативная зависимость для тестов без зависимостей Android, но платформа есть платформа (слишком много слов "зависимость" и "Android", но суть надеюсь вы поняли). Тут вам уже решать как поступать, мое решение я все таки затянул common модуль. Пропишем для запроса Repository и Use case: Перейдем к слою dataи добавим уже runtime зависимость в котором уже содержится классы Android'a. Оно будет добавлено с помощью метода api() для транзитивности. И давайте поправим нашу ошибку с прошлой статьи насчет DataMapper, там не нужен extension. Создаем модельку в слое data который будет имплементировать наш интерфейс для маппинга. Дальше пропишем сам запрос вApiServiceи инициализируем его. FooPagingResponse - это базовая обертка для любого запроса с пагинацией. Выглядит он таким образом: Далее как мы все знаем в Paging 3 содержится класс PagingSource от которого мы наследуемся и прописываем логику пагинации, так как для каждого запроса нам приходится писать классы с одинаковой функцией мы оптимизируем это созданием базового класса: Используем этот базовый класс и создаем FooPagingSource для нашего запроса: И переходим к репозиториям, в BaseRepository нам нужно будет добавить вспомогательный метод для запросов с пагинацией. В самом репозитории все будет выглядить таким образом: Инициализируем в RepositoriesModule Тут уже мы подошли к слою presentation. Нам нужно добавить дополнительные методы для обработки запроса с пагинацией в BaseViewModel и BaseFragment. Теперь напишем ещё одну модельку для этого слоя в котором у нас будет содержаться маппинг с domain в ui. IBaseDiffModel<T> - это интерфейс который нам помогает без дополнительных усилий создать Comparator (DiffUtil.ItemCallback) для использования в PagingDataAdapter или же ListAdapter. Ниже будет показан как должен выглядит этот файл. Дополнительно класс FooUI должен быть data class'ом чтобы под капотом уже переопределился метод equals() который нужен для IBaseDiffModel<T> и DiffUtil.ItemCallback. Переходим к сбору данных, вызываем запрос в ViewModel и собираем их в Fragment'e: Для того чтобы собрать отобразить данные нам нужен Recycler и соответственно Adapter для него. Так как PagingDataAdapter принимает в параметр DiffUtil.ItemCallback мы туда можем уже просто передать наш базовый Comparator которым у нас является BaseDiffUtilItemCallback(). А в Fragment'e у нас все просто, создаем adapter инициализируем с recycler'ом, делаем запрос и собираем данные. В результате все будет выглядить таким образом: Выше уже исправил, но здесь тоже упомяну в интерфейсе DataMapper не нужно создавать extension. Дальше давайте добавим метод в BaseRepository для обработки данных в случае успешного ответа сервера. И как теперь выглядит SignInRepositoryImpl Далее выведим файл NetworkErrorExtensions.kt в класс BaseFragment и сольем в один все методы: На этом все! В следующей статье разберем как сделать переход на детальную страницу и детальный запрос. Репозиторий где будет этот проект: github.com/TheAlisher/Boilerplate-Sample-Android. Код из статьи находиться в этой ветке. Основной репозиторий самого Boilerplate: github.com/TheAlisher/Boilerplate-Android  Kotlin разработчик