# AsyncPagingDataDiffer

Artifact: [androidx.paging:paging-runtime](https://developer.android.com/jetpack/androidx/releases/paging) [View Source](https://cs.android.com/search?q=file:androidx/paging/AsyncPagingDataDiffer.kt+class:androidx.paging.AsyncPagingDataDiffer) Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

*** ** * ** ***


```
public final class AsyncPagingDataDiffer<T extends Object>
```

<br />

*** ** * ** ***

Helper class for mapping a `https://developer.android.com/reference/androidx/paging/PagingData` into a `https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.Adapter`.

For simplicity, `https://developer.android.com/reference/androidx/paging/PagingDataAdapter` can often be used in place of this class. `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer` is exposed for complex cases, and where overriding `https://developer.android.com/reference/androidx/paging/PagingDataAdapter` to support paging isn't convenient.

## Summary

| ### Public constructors |
|---|
| `<T extends https://developer.android.com/reference/java/lang/Object.html> https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback,androidx.recyclerview.widget.ListUpdateCallback,kotlin.coroutines.CoroutineContext,kotlin.coroutines.CoroutineContext)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil.ItemCallback<@https://developer.android.com/reference/androidx/annotation/NonNull T> diffCallback, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/recyclerview/widget/ListUpdateCallback updateCallback, @https://developer.android.com/reference/androidx/annotation/NonNull https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.coroutines/-coroutine-context/index.html mainDispatcher, @https://developer.android.com/reference/androidx/annotation/NonNull https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.coroutines/-coroutine-context/index.html workerDispatcher )` |

| ### Public methods |
|---|---|
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#addLoadStateListener(kotlin.Function1)( @https://developer.android.com/reference/androidx/annotation/NonNull Function1<@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/CombinedLoadStates, https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener )` Add a `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` listener to observe the loading state of the current `https://developer.android.com/reference/androidx/paging/PagingData`. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#addOnPagesUpdatedListener(kotlin.Function0)(@https://developer.android.com/reference/androidx/annotation/NonNull Function0<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener)` Add a listener which triggers after the pages presented to the UI are updated, even if the actual items presented don't change. |
| `final T` | `@https://developer.android.com/reference/androidx/annotation/MainThread https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#getItem(kotlin.Int)(@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int index)` Get the item from the current PagedList at the specified index. |
| `final int` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#getItemCount()()` Get the number of items currently presented by this Differ. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html<@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/CombinedLoadStates>` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#getLoadStateFlow()()` A hot `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` of `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` that emits a snapshot whenever the loading state of the current `https://developer.android.com/reference/androidx/paging/PagingData` changes. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html>` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#getOnPagesUpdatedFlow()()` A hot `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` that emits after the pages presented to the UI are updated, even if the actual items presented don't change. |
| `final T` | `@https://developer.android.com/reference/androidx/annotation/MainThread https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#peek(kotlin.Int)(@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int index)` Returns the presented item at the specified position, without notifying Paging of the item access that would normally trigger page loads. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#refresh()()` Refresh the data presented by this `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer`. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#removeLoadStateListener(kotlin.Function1)( @https://developer.android.com/reference/androidx/annotation/NonNull Function1<@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/CombinedLoadStates, https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener )` Remove a previously registered `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` listener. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#removeOnPagesUpdatedListener(kotlin.Function0)(@https://developer.android.com/reference/androidx/annotation/NonNull Function0<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener)` Remove a previously registered listener for new `https://developer.android.com/reference/androidx/paging/PagingData` generations completing initial load and presenting to the UI. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#retry()()` Retry any failed load requests that would result in a `https://developer.android.com/reference/androidx/paging/LoadState.Error` update to this `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer`. |
| `final @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/ItemSnapshotList<@https://developer.android.com/reference/androidx/annotation/NonNull T>` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#snapshot()()` Returns a new `https://developer.android.com/reference/androidx/paging/ItemSnapshotList` representing the currently presented items, including any placeholders if they are enabled. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.paging.PagingData)(@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingData<@https://developer.android.com/reference/androidx/annotation/NonNull T> pagingData)` Present a `https://developer.android.com/reference/androidx/paging/PagingData` until it is invalidated by a call to `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#refresh()` or `https://developer.android.com/reference/androidx/paging/PagingSource#invalidate()`. |
| `final void` | `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.lifecycle.Lifecycle,androidx.paging.PagingData)( @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/lifecycle/Lifecycle lifecycle, @https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/PagingData<@https://developer.android.com/reference/androidx/annotation/NonNull T> pagingData )` Present a `https://developer.android.com/reference/androidx/paging/PagingData` until it is either invalidated or another call to `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.lifecycle.Lifecycle,androidx.paging.PagingData)` is made. |

## Public constructors

### AsyncPagingDataDiffer

```
public <T extends Object> AsyncPagingDataDiffer(
    @NonNull DiffUtil.ItemCallback<@NonNull T> diffCallback,
    @NonNull ListUpdateCallback updateCallback,
    @NonNull CoroutineContext mainDispatcher,
    @NonNull CoroutineContext workerDispatcher
)
```

## Public methods

### addLoadStateListener

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final void addLoadStateListener(
    @NonNull Function1<@NonNull CombinedLoadStates, Unit> listener
)
```

Add a `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` listener to observe the loading state of the current `https://developer.android.com/reference/androidx/paging/PagingData`.

As new `https://developer.android.com/reference/androidx/paging/PagingData` generations are submitted and displayed, the listener will be notified to reflect the current `https://developer.android.com/reference/androidx/paging/CombinedLoadStates`.

```kotlin
import androidx.paging.LoadState

val adapter = UserPagingAdapter()
adapter.addLoadStateListener {
    // show a retry button outside the list when refresh hits an error
    retryButton.isVisible = it.refresh is LoadState.Error

    // swipeRefreshLayout displays whether refresh is occurring
    swipeRefreshLayout.isRefreshing = it.refresh is LoadState.Loading

    // show an empty state over the list when loading initially, before items are loaded
    emptyState.isVisible = it.refresh is LoadState.Loading && adapter.itemCount == 0
}
```

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull Function1<@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/CombinedLoadStates, https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener` | `https://developer.android.com/reference/androidx/paging/LoadStates` listener to receive updates. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#removeLoadStateListener(kotlin.Function1)` |   |

### addOnPagesUpdatedListener

Added in [3.1.0](https://developer.android.com/jetpack/androidx/releases/paging#3.1.0)

```
public final void addOnPagesUpdatedListener(@NonNull Function0<Unit> listener)
```

Add a listener which triggers after the pages presented to the UI are updated, even if the actual items presented don't change.

An update is triggered from one of the following:

- `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.paging.PagingData)` is called and initial load completes, regardless of any differences in the loaded data

- A `https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult.Page` is inserted

- A `https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult.Page` is dropped

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull Function0<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener` | called after pages presented are updated. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#removeOnPagesUpdatedListener(kotlin.Function0)` |   |

### getItem

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
@MainThread
public final T getItem(@IntRange(from = 0) int index)
```

Get the item from the current PagedList at the specified index.

Note that this operates on both loaded items and null padding within the PagedList.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int index` | Index of item to get, must be \>= 0, and \<`https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#itemCount()` |

| Returns |
|---|---|
| `T` | The item, or `null`, if a `null` placeholder is at the specified position. |

### getItemCount

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final int getItemCount()
```

Get the number of items currently presented by this Differ. This value can be directly returned to `https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.Adapter#getItemCount()`.

| Returns |
|---|---|
| `int` | Number of items being presented, including placeholders. |

### getLoadStateFlow

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final @NonNull Flow<@NonNull CombinedLoadStates> getLoadStateFlow()
```

A hot `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` of `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` that emits a snapshot whenever the loading state of the current `https://developer.android.com/reference/androidx/paging/PagingData` changes.

This flow is conflated, so it buffers the last update to `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` and delivers the current load states on collection when RecyclerView is not dispatching layout.

```kotlin
import androidx.lifecycle.lifecycleScope
import androidx.paging.LoadState

val adapter = UserPagingAdapter()
lifecycleScope.launch {
    adapter.loadStateFlow
        .map { it.refresh }
        .distinctUntilChanged()
        .collectLatest {
            // show a retry button outside the list when refresh hits an error
            retryButton.isVisible = it is LoadState.Error

            // swipeRefreshLayout displays whether refresh is occurring
            swipeRefreshLayout.isRefreshing = it is LoadState.Loading

            // show an empty state over the list when loading initially, before items are loaded
            emptyState.isVisible = it is LoadState.Loading && adapter.itemCount == 0
        }
}
```

### getOnPagesUpdatedFlow

Added in [3.1.0](https://developer.android.com/jetpack/androidx/releases/paging#3.1.0)

```
public final @NonNull Flow<Unit> getOnPagesUpdatedFlow()
```

A hot `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` that emits after the pages presented to the UI are updated, even if the actual items presented don't change.

An update is triggered from one of the following:

- `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.paging.PagingData)` is called and initial load completes, regardless of any differences in the loaded data

- A `https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult.Page` is inserted

- A `https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult.Page` is dropped

Note: This is a `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-shared-flow/index.html` configured to replay 0 items with a buffer of size 64. If a collector lags behind page updates, it may trigger multiple times for each intermediate update that was presented while your collector was still working. To avoid this behavior, you can `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/index.html` this `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` so that you only receive the latest update, which is useful in cases where you are simply updating UI and don't care about tracking the exact number of page updates.

### peek

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
@MainThread
public final T peek(@IntRange(from = 0) int index)
```

Returns the presented item at the specified position, without notifying Paging of the item access that would normally trigger page loads.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/IntRange(from = 0) int index` | Index of the presented item to return, including placeholders. |

| Returns |
|---|---|
| `T` | The presented item at position `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#peek(kotlin.Int)`, `null` if it is a placeholder |

### refresh

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final void refresh()
```

Refresh the data presented by this `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer`.

`https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#refresh()` triggers the creation of a new `https://developer.android.com/reference/androidx/paging/PagingData` with a new instance of `https://developer.android.com/reference/androidx/paging/PagingSource` to represent an updated snapshot of the backing dataset. If a `https://developer.android.com/reference/androidx/paging/RemoteMediator` is set, calling `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#refresh()` will also trigger a call to `https://developer.android.com/reference/androidx/paging/RemoteMediator#load(androidx.paging.LoadType,androidx.paging.PagingState)` with `https://developer.android.com/reference/androidx/paging/LoadType#REFRESH` to allow `https://developer.android.com/reference/androidx/paging/RemoteMediator` to check for updates to the dataset backing `https://developer.android.com/reference/androidx/paging/PagingSource`.

Note: This API is intended for UI-driven refresh signals, such as swipe-to-refresh. Invalidation due repository-layer signals, such as DB-updates, should instead use `https://developer.android.com/reference/androidx/paging/PagingSource#invalidate()`.

```kotlin
import androidx.appcompat.app.AppCompatActivity
import androidx.paging.LoadState

class MyActivity : AppCompatActivity() {
    private lateinit var binding: MyActivityBinding
    private val pagingAdapter = UserPagingAdapter()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = MyActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.recyclerView.adapter = pagingAdapter
        pagingAdapter.addLoadStateListener { loadStates ->
            binding.swipeRefreshLayout.isRefreshing = loadStates.refresh is LoadState.Loading
        }

        binding.swipeRefreshLayout.setOnRefreshListener { pagingAdapter.refresh() }
    }
}
```

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/PagingSource#invalidate()` |   |

### removeLoadStateListener

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final void removeLoadStateListener(
    @NonNull Function1<@NonNull CombinedLoadStates, Unit> listener
)
```

Remove a previously registered `https://developer.android.com/reference/androidx/paging/CombinedLoadStates` listener.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull Function1<@https://developer.android.com/reference/androidx/annotation/NonNull https://developer.android.com/reference/androidx/paging/CombinedLoadStates, https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener` | Previously registered listener. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#addLoadStateListener(kotlin.Function1)` |   |

### removeOnPagesUpdatedListener

Added in [3.1.0](https://developer.android.com/jetpack/androidx/releases/paging#3.1.0)

```
public final void removeOnPagesUpdatedListener(@NonNull Function0<Unit> listener)
```

Remove a previously registered listener for new `https://developer.android.com/reference/androidx/paging/PagingData` generations completing initial load and presenting to the UI.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/NonNull Function0<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html> listener` | Previously registered listener. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#addOnPagesUpdatedListener(kotlin.Function0)` |   |

### retry

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final void retry()
```

Retry any failed load requests that would result in a `https://developer.android.com/reference/androidx/paging/LoadState.Error` update to this `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer`.

Unlike `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#refresh()`, this does not invalidate `https://developer.android.com/reference/androidx/paging/PagingSource`, it only retries failed loads within the same generation of `https://developer.android.com/reference/androidx/paging/PagingData`.

`https://developer.android.com/reference/androidx/paging/LoadState.Error` can be generated from two types of load requests:

- `https://developer.android.com/reference/androidx/paging/PagingSource#load(androidx.paging.PagingSource.LoadParams)` returning `https://developer.android.com/reference/androidx/paging/PagingSource.LoadResult.Error`

- `https://developer.android.com/reference/androidx/paging/RemoteMediator#load(androidx.paging.LoadType,androidx.paging.PagingState)` returning `https://developer.android.com/reference/androidx/paging/RemoteMediator.MediatorResult.Error`

### snapshot

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final @NonNull ItemSnapshotList<@NonNull T> snapshot()
```

Returns a new `https://developer.android.com/reference/androidx/paging/ItemSnapshotList` representing the currently presented items, including any placeholders if they are enabled.

### submitData

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final void submitData(@NonNull PagingData<@NonNull T> pagingData)
```

Present a `https://developer.android.com/reference/androidx/paging/PagingData` until it is invalidated by a call to `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#refresh()` or `https://developer.android.com/reference/androidx/paging/PagingSource#invalidate()`.

This method is typically used when collecting from a `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` produced by `https://developer.android.com/reference/androidx/paging/Pager`. For RxJava or LiveData support, use the non-suspending overload of `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.paging.PagingData)`, which accepts a `https://developer.android.com/reference/androidx/lifecycle/Lifecycle`.

Note: This method suspends while it is actively presenting page loads from a `https://developer.android.com/reference/androidx/paging/PagingData`, until the `https://developer.android.com/reference/androidx/paging/PagingData` is invalidated. Although cancellation will propagate to this call automatically, collecting from a `https://developer.android.com/reference/androidx/paging/Pager#flow()` with the intention of presenting the most up-to-date representation of your backing dataset should typically be done using `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/index.html`.

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/Pager` |   |

### submitData

Added in [3.0.0](https://developer.android.com/jetpack/androidx/releases/paging#3.0.0)

```
public final void submitData(
    @NonNull Lifecycle lifecycle,
    @NonNull PagingData<@NonNull T> pagingData
)
```

Present a `https://developer.android.com/reference/androidx/paging/PagingData` until it is either invalidated or another call to `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.lifecycle.Lifecycle,androidx.paging.PagingData)` is made.

This method is typically used when observing a RxJava or LiveData stream produced by `https://developer.android.com/reference/androidx/paging/Pager`. For `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html` support, use the suspending overload of `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.lifecycle.Lifecycle,androidx.paging.PagingData)`, which automates cancellation via `https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html` instead of relying of `https://developer.android.com/reference/androidx/lifecycle/Lifecycle`.

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/paging/AsyncPagingDataDiffer#submitData(androidx.lifecycle.Lifecycle,androidx.paging.PagingData)` |   |
| `https://developer.android.com/reference/androidx/paging/Pager` |   |