Пейджинг 3. Почему нижний колонтитул повтора не вызывает метод загрузки моего источника PagingSource?

Я внедрил Paging 3 в свое приложение после codelab и добавил нижний колонтитул с кнопкой повтора через withLoadStateHeaderAndFooter:

recycler_view_results.adapter = adapter.withLoadStateHeaderAndFooter(
    header = UnsplashLoadStateAdapter { adapter.retry() },
    footer = UnsplashLoadStateAdapter { adapter.retry() }
)

Когда я нажимаю кнопку повтора в ViewHolder нижнего колонтитула, adapter.retry()действительно называется, значит, настройка верна. Однако этот метод никогда не заканчивается вызовом моего PagingSourceload метод, как обычно.

My PagingSource (я проверил, что LoadResult.Error возвращается правильно в случае ошибки):

class UnsplashPagingSource(
    private val unsplashApi: UnsplashApi,
    private val query: String
) : PagingSource<Int, UnsplashPhoto>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, UnsplashPhoto> {
        val position = params.key ?: UNSPLASH_STARTING_PAGE_INDEX
        return try {
            val response = unsplashApi.searchPhotos(query, position, params.loadSize)
            val photos = response.results
            LoadResult.Page(
                data = photos,
                prevKey = if (position == UNSPLASH_STARTING_PAGE_INDEX) null else position - 1,
                nextKey = if (photos.isEmpty()) null else position + 1
            )
        } catch (exception: IOException) {
            return LoadResult.Error(exception)
        } catch (exception: HttpException) {
            return LoadResult.Error(exception)
        }
    }
}

Мой репозиторий:

class UnsplashRepository @Inject constructor(private val unsplashApi: UnsplashApi) {

    fun getSearchResultStream(query: String): Flow<PagingData<UnsplashPhoto>> {
        return Pager(
            config = PagingConfig(
                pageSize = NETWORK_PAGE_SIZE,
                enablePlaceholders = false
            ),
            pagingSourceFactory = { UnsplashPagingSource(unsplashApi, query) }
        ).flow
    }

    companion object {
        private const val NETWORK_PAGE_SIZE = 20
    }
}

А в своем фрагменте я делаю так:

private fun searchPhotos(query: String) {
    searchJob?.cancel()
    searchJob = lifecycleScope.launch {
        viewModel.searchPhotos(query).collectLatest {
            adapter.submitData(it)
        }
    }
}

Интересно, что кнопка повтора для пустого списка работает:

retry_button.setOnClickListener {
    adapter.retry()
    // this works
}

1 ответ

Теперь он работает после того, как я обновил зависимость подкачки с "3.0.0-alpha02" до "3.0.0-alpha03". Похоже, это ошибка библиотеки.

Впоследствии я также нашел соответствующий отчет об ошибке: https://issuetracker.google.com/issues/160194384

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