Android分页库与清晰架构

28

我正在尝试使用Android Architecture Component中的分页库,但我对将其集成到基于干净架构的项目中有疑虑。

一般来说,我有3个模块:

  • 主模块(应用程序)
  • 数据模块(具有网络和数据库依赖项的Android模块)
  • 域模块(纯Kotlin模块)

为了引入分页,我必须将PagedList<T>类视为域类。 (在我看来,这不是一个可怕的想法,因为最终它只是一个列表,并且数据源已经抽象化了)

所以在域层中,我可以有一个像这样的存储库:

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()
}

目前为止一切顺利。我的疑问是,当我们需要为呈现层转换领域模型时(比如说,我的项目需要知道是否已选中以显示选中图标),通常我会将领域模型映射到呈现模型。

我知道 DataSourceFactorymapmapByPage 方法,但是工厂位于数据层。我的 Viewmodel 从模型层消费数据,这种情况下将是一个 PagedList,据我所知,分页列表不支持映射。

那么在这种情况下应该怎么做呢?


2
我今天也遇到了同样的问题,但是我找不到任何示例。我认为分页库无法与清晰代码架构集成。 - Osama Aftab
2
@Marco Pierucci,你是如何将Android库(paging)添加到Kotlin模块(domain)中的?这是否可能? - Saman Sattari
还请查看 https://stackoverflow.com/q/70707468/4134215 - Taimoor Khan
1个回答

6

由于PagedListAdapter需要PagedList来加载下一页/上一页,因此您无法将PagedList映射到演示模型中。

PagedList有两个主要功能。首先,它是一个数据结构,用于保存分页的项目列表(部分存在,部分不存在)。使用snapshot(),您可以轻松获取当前存在的项目,将域模型映射为演示模型并将其传递给ListAdapter以显示项目列表。

其次,当需要更多页面时,它必须通知DataSourcePagedListAdapter接收PagedList,并在绑定项目时依赖于PagedListloadAround()方法来检测何时需要新页面。

免责声明:这只是我的观点,可供讨论,但是PagingLibrary默认情况下不是一个干净的解决方案,最简单的方法是在获取它们(无论是网络还是数据库)时在DataStore中映射模型,并将PagedList演示模型一起传递到演示层。映射PagedList本身不是逻辑上的(虽然可能),因为它与View中的PagedListAdapter紧密耦合。


你如何定义一个DataStore,它可以在数据库实体和展示模型之间进行映射? - Hector
1
@Hector 如果你正在使用Paging Library 3的PagingData<T>,你可以通过两次映射来获取模型,像这样: Pager( config = PagingConfig( pageSize = 20, enablePlaceholders = false, ), remoteMediator = NewsRemoteMediator(newsDataBase, api), pagingSourceFactory = pagingSourceFactory ).flow.map { it -> it.map { it.toDomain() } } - Amr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接