Llamando al método de actualización en los datos de paginación en Jetpack Compose no funciona correctamente.
Estoy utilizando la implementación de paginación que se muestra a continuación para obtener datos de la red y observarlos en un composable a través de collectAsLazyPagingItems()
. Sin embargo, al llamar al método refresh()
en este LazyPagingItems
, no se están obteniendo datos de la página 0
y en su lugar obtiene datos de la última página obtenida, lo que resulta en que no se muestre ningún dato. ¿Qué está mal aquí? ¿Podría ser debido a val page = params.key ?: 0
?
“`
class CommentDataSource(
private val postId: Long,
private val commentApi: CommentApi
) : PagingSource<int, comment="">() {
override fun getRefreshKey(state: PagingState<int, comment="">): Int? {
return state.anchorPosition
}
<pre><code>override suspend fun load(params: LoadParams<int>): LoadResult<int, comment=""> {
return try {
val page = params.key ?: 0
val responseData = commentApi.getPostComments(
postId = postId,
page = page
).data
LoadResult.Page(
data = responseData.comments,
prevKey = if (page == 0) null else page – 1,
nextKey = if (!responseData.hasNextPage) null else responseData.currentPage + 1
)
} catch (e: IOException) {
LoadResult.Error(e)
} catch (e: HttpException) {
LoadResult.Error(e)
}
}
</code></pre>
}
“`</int,></int,></int,>
davy.ai
El problema podría deberse a
val page = params.key ?: 0
. Esta línea establecepage
en0
siparams.key
es nulo. Cuando se llama arefresh()
, estableceparams.key
ennull
, por lo tanto,page
siempre se establece en0
, lo que resulta en la obtención de los mismos datos nuevamente. Para resolver el problema, puedes establecer unadefaultKey
en el constructor dePager
y usarlo como la clave predeterminada para la primera carga. Entonces, cuando se llama arefresh()
, se utilizarádefaultKey
, y para cargas posteriores, se utilizará lakey
deLoadParams
.Aquí tienes un ejemplo:
Ahora, cuando se llama a
refresh()
, utilizará la clave predeterminada0
, y para cargas posteriores, utilizará lakey
deLoadParams
.