Библиотека подкачки Android с чистой архитектурой

Я пробовал использовать библиотеку подкачки из Компонент архитектуры Android, но сомневаюсь, что интегрирую ее в проект, основанный на чистой архитектуре.

Обычно у меня 3 модуля:

  • Главный модуль (приложение)
  • Модуль данных (модуль Android с зависимостями от сети и базы данных)
  • Модуль домена (Чистый модуль Kotlin)

Чтобы ввести разбиение на страницы, мне пришлось рассматривать класс 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, и, насколько мне известно, постраничный список не поддерживает отображение.

Итак, что было бы подходящим поступком в этой ситуации?

Сегодня я столкнулся с той же проблемой, и я не смог найти ни одного образца, я думаю, что библиотека подкачки не может быть интегрирована с архитектурой чистого кода.

Osama Aftab 07.12.2019 18:33

@Marco Pierucci Как вы добавили библиотеку Android (подкачку) в модуль kotlin (домен)? это вообще возможно?

Saman Sattari 18.02.2021 23:36
26
2
2 696
1

Ответы 1

Вы не можете сопоставить PagedList с моделью презентации, так как PagedListAdapter нужен PagedList для загрузки следующих / предыдущих страниц.

PagedList имеет две основные функции: во-первых, это структура данных для хранения List элементов, которые выгружены (часть присутствует, а часть отсутствует), с помощью snapshot() вы можете легко получить существующие элементы, отобразить модель домена в презентационную и передать ее в ListAdapter, чтобы показать список элементов.

Во-вторых, он должен предупреждать DataSource, когда нужны дополнительные страницы. PagedListAdapter получает PagedList, и при связывании элементов он зависит от метода loadAround()PagedList для определения, когда необходимы новые страницы.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это всего лишь мое мнение и открыто для обсуждения. но PagingLibrary не является чистым решением по умолчанию, самый простой способ - отобразить модель домен внутри DataStore при их извлечении (либо по сети, либо из базы данных) и передать PagedList с моделями презентация на уровень представления. Само отображение PagedList нелогично (хотя и возможно), поскольку оно тесно связано с PagedListAdapter в View.

как вы определяете хранилище данных, которое сопоставляет сущности базы данных и модели представления?

Hector 03.08.2018 16:15

@Hector, если вы используете PagingData <T> с библиотекой подкачки 3, вы можете просто сопоставить его дважды, чтобы добраться до модели, подобной этой Pager (config = PagingConfig (pageSize = 20, enablePlaceholder = false,), remoteMediator = NewsRemoteMediator (newsDataBase, api ), pagingSourceFactory = pagingSourceFactory) .flow.map {it -> it.map {it.toDomain ()}}

Amr 03.04.2021 08:18

Другие вопросы по теме