From e20ab8968885fa0ddf71de9d45cb32bc9b9c178e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 17 Jun 2025 15:45:05 +0600 Subject: [PATCH] improvements in InfinityPagedComponent --- CHANGELOG.md | 5 ++ .../kotlin/InfinityPagedComponent.kt | 47 ++++++++++++++++--- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de0d359e1d8..88d4c415e4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## 0.25.8 +* `Pagination`: + * `Compose`: + * New function `rememberInfinityPagedComponentContext` to create `InfinityPagedComponentContext` + * New variants of `InfinityPagedComponent` component + ## 0.25.7 * `Versions`: diff --git a/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt b/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt index c52766f2e28..a30a2b98a54 100644 --- a/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt +++ b/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt @@ -65,6 +65,44 @@ class InfinityPagedComponentContext internal constructor( } } +/** + * Creates and remembers an [InfinityPagedComponentContext] for managing infinite pagination in a Compose UI. + * This function is used to create a persistent pagination context that survives recompositions. + * + * @param size Number of items to load per page. + * @param page Initial page number to start pagination from (defaults to 0). + * @param scope [CoroutineScope] to launch pagination operations in. If not provided, a new scope will be created + * using [rememberCoroutineScope]. + * @param loader Suspended function that loads paginated data. Receives the current pagination context and + * pagination parameters, and returns a [PaginationResult] containing the loaded data. + * @return An [InfinityPagedComponentContext] instance that manages the pagination state and operations. + */ +@Composable +fun rememberInfinityPagedComponentContext( + size: Int, + page: Int = 0, + scope: CoroutineScope = rememberCoroutineScope(), + loader: suspend InfinityPagedComponentContext.(Pagination) -> PaginationResult +) = remember { + InfinityPagedComponentContext(page = page, size = size, scope = scope, loader = loader) +} + +/** + * Composable function for managing an infinitely paged component. + * + * @param T The type of the paginated data. + * @param block Composable function that renders the UI with the loaded data. When data is in loading state, block will + * receive null as `it` parameter + */ +@Composable +internal fun InfinityPagedComponent( + context: InfinityPagedComponentContext, + block: @Composable InfinityPagedComponentContext.(List?) -> Unit +) { + val dataState = context.dataState.collectAsState() + context.block(dataState.value) +} + /** * Composable function for managing an infinitely paged component. * @@ -84,13 +122,8 @@ internal fun InfinityPagedComponent( block: @Composable InfinityPagedComponentContext.(List?) -> Unit ) { val scope = predefinedScope ?: rememberCoroutineScope() - val context = remember { InfinityPagedComponentContext(page, size, scope, loader) } - remember { - context.reload() - } - - val dataState = context.dataState.collectAsState() - context.block(dataState.value) + val context = rememberInfinityPagedComponentContext(page = page, size = size, scope = scope, loader = loader) + InfinityPagedComponent(context, block) } /**