Jetpack Paging3 RemoteMediator возвращает тот же PagingSatate при #load append

Я следую этому codelab, чтобы создать приложение paging3 с API github и локальная БД. Пока первые 2 страницы загружаются нормально, посредник зацикливается при попытке загрузить 3-ю страницу при прокрутке вниз - одно и то же PagingState передается в функцию load () снова и снова.

Просто интересно, знает ли кто-нибудь, что может быть здесь основной причиной?

Некоторые детали реализации:

RemoteMediator: (prevPage и currentPage взяты из github API заголовок ответа разбиения на страницы и сохраняется в локальной БД.)

// RepositoryMediator
override suspend fun load(
    loadType: LoadType,
    state: PagingState<Int, Repository>
): MediatorResult {
    return when (loadType) {
        LoadType.REFRESH -> {
            fireRequestForPage(1, true /*clear DB*/)
            return Success(endOfPaginationReached = false)
        }

        LoadType.APPEND -> {
            // !!!!!!! kept getting the same state when APPEND is triggered, resulting in same currentPage and nextPage
            // get currentPage, nextPage from state.lastItemOrNull
            if(currentPage < nextPage) {
              fireRequestForPage(nextPage)
              Success(endOfPaginationReached = false)
            } else {
              return Success(endOfPaginationReached = true)
            }
        LoadType.PREPEND -> {
            // get currentPage, prevPage from state.firstItemOrNull
            if(currentPage > prevPage) {
              fireRequestForPage(prevPage)
              Success(endOfPaginationReached = false)
            } else {
              return Success(endOfPaginationReached = true)
            }
        }
    }
}

Наблюдаемый: я использую liveData вместо flow для из Pager:

fun searchRepositoryWithUserId(userLoginName: String): LiveData<PagingData<Repository>> {
    // need to create a new Pager each time because the search query is different
    return Pager(
        config = PagingConfig(pageSize = PAGE_SIZE, enablePlaceholders = false),
        remoteMediator = RepositoryMediator()
    ) {
        repoDao().getRepositoriesOfUser(userLoginName)
    }.liveData
}

Дао: простой запрос

@Query("SELECT * FROM repository_table WHERE login = :ownerLoginName")
fun getRepositoriesOfUser(ownerLoginName: String): PagingSource<Int, Repository>

person Arrow Cen    schedule 06.01.2021    source источник


Ответы (1)


Для всех, кто интересуется, исправление от Dao, необходимо обновить запрос для сортировки по повторному имени, иначе запрос вернет ту же последнюю страницу для PagingSource, даже если в БД были вставлены новые элементы, что сбивает посредника с толку.

@Query("SELECT * FROM repository_table WHERE login = :ownerLoginName ORDER BY repository_name ASC")
fun getRepositoriesOfUser(ownerLoginName: String): PagingSource<Int, Repository>
person Arrow Cen    schedule 07.01.2021