Я пробовал использовать библиотеку подкачки из Компонент архитектуры Android, но сомневаюсь, что интегрирую ее в проект, основанный на чистой архитектуре.
Обычно у меня 3 модуля:
Чтобы ввести разбиение на страницы, мне пришлось рассматривать класс PagedList<T>
как класс предметной области. (IMO - неплохая идея, так как в конечном итоге это список, а источник данных абстрагируется)
Итак, на уровне домена у меня может быть репозиторий, например:
interface ItemRepository {
fun getItems():PagedList<Item>
}
А затем в модуле данных создайте такую реализацию:
class ItemRepositoryImpl: ItemRepositoy(private val factory:ItemDataSourceFavtory) {
fun getItems():PagedList<Item> {
val pageConfigurations = PagedList.Config.Builder()
.setPageSize(10)
.setInitialLoadSizeHint(15)
.setPrefetchDistance(5)
.setEnablePlaceholders(false)
.build()
return RxPagedListBuilder(locationDataSourceFactory, pageConfigurations)
.setInitialLoadKey(1)
.buildObservable()
}
Все идет нормально. Я сомневаюсь, что когда нам нужно преобразовать модель доменов для уровня представления (скажем, мой элемент должен знать, был ли отмечен флажок для отображения отмеченного значка), я обычно отображаю свою модель домена в презентационную.
Я знаю, что DataSourceFactory
имеет методы map
и mapByPage
, но фабрика находится на уровне данных. Моя модель просмотра потребляет данные из уровня модели, которым в данном случае будет PagedList
, и, насколько мне известно, постраничный список не поддерживает отображение.
Итак, что было бы подходящим поступком в этой ситуации?
@Marco Pierucci Как вы добавили библиотеку Android (подкачку) в модуль kotlin (домен)? это вообще возможно?
Вы не можете сопоставить PagedList
с моделью презентации, так как PagedListAdapter
нужен PagedList
для загрузки следующих / предыдущих страниц.
PagedList имеет две основные функции: во-первых, это структура данных для хранения List
элементов, которые выгружены (часть присутствует, а часть отсутствует), с помощью snapshot()
вы можете легко получить существующие элементы, отобразить модель домена в презентационную и передать ее в ListAdapter, чтобы показать список элементов.
Во-вторых, он должен предупреждать DataSource
, когда нужны дополнительные страницы. PagedListAdapter
получает PagedList
, и при связывании элементов он зависит от метода loadAround()
PagedList
для определения, когда необходимы новые страницы.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это всего лишь мое мнение и открыто для обсуждения.
но PagingLibrary
не является чистым решением по умолчанию, самый простой способ - отобразить модель домен внутри DataStore
при их извлечении (либо по сети, либо из базы данных) и передать PagedList
с моделями презентация на уровень представления. Само отображение PagedList нелогично (хотя и возможно), поскольку оно тесно связано с PagedListAdapter
в View
.
как вы определяете хранилище данных, которое сопоставляет сущности базы данных и модели представления?
@Hector, если вы используете PagingData <T> с библиотекой подкачки 3, вы можете просто сопоставить его дважды, чтобы добраться до модели, подобной этой Pager (config = PagingConfig (pageSize = 20, enablePlaceholder = false,), remoteMediator = NewsRemoteMediator (newsDataBase, api ), pagingSourceFactory = pagingSourceFactory) .flow.map {it -> it.map {it.toDomain ()}}
Сегодня я столкнулся с той же проблемой, и я не смог найти ни одного образца, я думаю, что библиотека подкачки не может быть интегрирована с архитектурой чистого кода.