ItemSnapshotListFlow

Added in 3.5.0-beta01

public final class ItemSnapshotListFlow


Summary

Public methods

static final @NonNull Flow<@NonNull ItemSnapshotList<@NonNull T>>
<T extends Object> asItemSnapshotListFlow(
    @NonNull Flow<@NonNull PagingData<@NonNull T>> receiver,
    @NonNull Function1<@NonNull CombinedLoadStatesUnit> onLoadError
)

Converts a Flow of PagingData into a Flow of ItemSnapshotList.

Public methods

asItemSnapshotListFlow

public static final @NonNull Flow<@NonNull ItemSnapshotList<@NonNull T>> <T extends Object> asItemSnapshotListFlow(
    @NonNull Flow<@NonNull PagingData<@NonNull T>> receiver,
    @NonNull Function1<@NonNull CombinedLoadStatesUnit> onLoadError
)

Converts a Flow of PagingData into a Flow of ItemSnapshotList. An emitted ItemSnapshotList contains a snapshot of all loaded data and can be cached for repeated reads.

To reflect the latest snapshot, this flow emits a new ItemSnapshotList whenever new items are loaded or whenever loaded items are dropped (i.e. to fulfill PagingConfig.maxSize).

The flow is kept active as long as the collection scope is active. To avoid leaks, make sure to use a scope that is already managed (like a ViewModel scope) or manually cancel it when you don't need paging anymore.

To use this flow with multiple collectors, convert it to a SharedFlow with Flow operators such as stateIn() or sharedIn().

Note that this Flow remains as a cold flow and does not start any loading until collected upon.

T - the paged item type

import androidx.compose.foundation.lazy.items
import androidx.lifecycle.ViewModel
import androidx.paging.ItemSnapshotList
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingSource
import androidx.paging.asItemSnapshotListFlow

lateinit var pagingSourceFactory: () -> PagingSource<String, SampleData.Item>

/** Initialize Pager in ViewModel */
val pager =
    Pager(config = PagingConfig(pageSize = 40), pagingSourceFactory = pagingSourceFactory)

val itemsFlow = pager.flow.asItemSnapshotListFlow()
import androidx.compose.foundation.lazy.items
import androidx.lifecycle.ViewModel
import androidx.paging.ItemSnapshotList
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingSource
import androidx.paging.asItemSnapshotListFlow
import androidx.paging.insertSeparators

lateinit var pagingSourceFactory: () -> PagingSource<String, SampleData.Item>

/** Initialize Pager in ViewModel */
val pager =
    Pager(config = PagingConfig(pageSize = 40), pagingSourceFactory = pagingSourceFactory)

val itemsFlow: Flow<ItemSnapshotList<SampleData>> =
    pager.flow
        /**
         * To improve performance, apply mapping and transformations on [Pager.flow] before
         * calling asState() to ensure that transforms are executed incrementally on newly
         * loaded data.
         */
        .map { pagingData ->
            pagingData.insertSeparators { _, next ->
                if (next?.value?.rem(10) == 0) SampleData.Separator(next.value.toString())
                else null
            }
        }
        .asItemSnapshotListFlow()
import androidx.compose.foundation.lazy.items
import androidx.lifecycle.ViewModel
import androidx.paging.ItemSnapshotList
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingSource
import androidx.paging.asItemSnapshotListFlow

lateinit var pagingSourceFactory: () -> PagingSource<String, SampleData.Item>

/** Initialize Pager in ViewModel */
val pager =
    Pager(config = PagingConfig(pageSize = 40), pagingSourceFactory = pagingSourceFactory)
val itemsFlow =
    pager.flow.asItemSnapshotListFlow { _ ->
        /** Retries the failed load without invalidating the PagingSource */
        pager.retry()
    }
Parameters
@NonNull Function1<@NonNull CombinedLoadStatesUnit> onLoadError

the callback invoked when any loads return androidx.paging.LoadState.Error. Provides the CombinedLoadStates containing the error. No-op by default. See Pager.retry for a recovery option.