Как внедрить фабрику источников данных из библиотеки разбивки на страницы Android?

Я использую библиотеку разбивки на страницы и хочу внедрить источник данных в свою модель представления. Моя фабрика выглядит так:

class ArticleDataSourceFactory @Inject constructor(
    val articleRepository: ArticleRepository
) : DataSource.Factory<Long, Article>() {

    override fun create(): DataSource<Long, Article> {
        return ArticleDateKeyedDataSource(articleRepository)
    }
}

Мой источник данных:

class ArticleDateKeyedDataSource(
    private val repository: ArticleRepository
) : ItemKeyedDataSource<Long, Article>() {
    override fun loadInitial(params: LoadInitialParams<Long>, callback: LoadInitialCallback<Article>) {
        val articles = repository.getInitial(params.requestedInitialKey!!, params.requestedLoadSize)
        callback.onResult(articles)
    }

    override fun loadAfter(params: LoadParams<Long>, callback: LoadCallback<Article>) {
        val articles = repository.getAfter(params.key, params.requestedLoadSize)
        callback.onResult(articles)
    }

    override fun loadBefore(params: LoadParams<Long>, callback: LoadCallback<Article>) {
        val articles = repository.getBefore(params.key, params.requestedLoadSize)
        callback.onResult(articles)
    }

    override fun getKey(item: Article): Long {
        return item.createdAt
    }
}

И моя ViewModel:

class ArticleFragmentViewModel @Inject constructor(
    private val dataSourceFactory: ArticleDataSourceFactory
) : BaseViewModel() {

    var initialArticlePosition = 0L

    val navigateToArticleDetails: MutableLiveData<SingleEvent<Long>> = MutableLiveData()

    val articlesLiveList: LiveData<PagedList<Article>>
        get() {
            val config = PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPageSize(5)
                .build()

            return LivePagedListBuilder(dataSourceFactory, config)
                .setInitialLoadKey(initialArticlePosition)
                .setFetchExecutor(Executors.newSingleThreadExecutor())
                .build()
        }


    fun onArticleSelected(createdAt: Long) {
        navigateToArticleDetails.value = SingleEvent(createdAt)
    }
}

После ребилда получаю ошибку:

error: cannot access DataSource
  class file for androidx.paging.DataSource not found
  Consult the following stack trace for details.    

Что это значит? Я понятия не имею, что я делаю неправильно. Например, у меня нет проблем с внедрением репозитория.


person Darthoo    schedule 20.02.2019    source источник
comment
Ваш заводской код выглядит нормально. Вы можете поделиться источником данных и просмотреть код модели.   -  person Hussnain Haidar    schedule 20.02.2019
comment
отредактировал мой вопрос   -  person Darthoo    schedule 20.02.2019
comment
Извините, я не знаю истинной причины. Но я предполагаю, что вы обращаетесь к источнику данных до инициализации dataSourceFactory   -  person Hussnain Haidar    schedule 20.02.2019
comment
Предоставляете ли вы источник данных в своем модуле?   -  person G_comp    schedule 05.11.2019
comment
Нет. Я инициализирую источник данных в методе create() на фабрике источников данных. Что описано в первом фрагменте. Должен ли я написать поставщика для этой фабрики?   -  person Darthoo    schedule 06.11.2019


Ответы (1)


Вы использовали модуль Android? Вам может понадобиться использовать зависимость api в базовом модуле, например

api "androidx.paging:paging-runtime-ktx:$paging_version"

И есть похожая проблема https://stackoverflow.com/a/47128596/5934119

person HvSimon    schedule 13.03.2020