From 0d0cc70abee69e887dbe1906aadd82ec4357db99 Mon Sep 17 00:00:00 2001 From: SkyD666 Date: Wed, 22 Jan 2025 23:55:09 +0800 Subject: [PATCH] [fix] Collect paging data with lifecycle https://slack-chats.kotlinlang.org/t/509686/does-collectaslazypagingitems-respect-something-like-flow-fl --- .../java/com/skyd/rays/ext/LazyPagingExt.kt | 22 +++++++++++++++++++ .../model/respository/SearchRepository.kt | 2 +- .../screen/stickerslist/StickersListScreen.kt | 4 +++- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/skyd/rays/ext/LazyPagingExt.kt diff --git a/app/src/main/java/com/skyd/rays/ext/LazyPagingExt.kt b/app/src/main/java/com/skyd/rays/ext/LazyPagingExt.kt new file mode 100644 index 0000000..2c03dcc --- /dev/null +++ b/app/src/main/java/com/skyd/rays/ext/LazyPagingExt.kt @@ -0,0 +1,22 @@ +package com.skyd.rays.ext + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.flowWithLifecycle +import androidx.paging.PagingData +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.collectAsLazyPagingItems +import kotlinx.coroutines.flow.Flow +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext + +@Composable +fun Flow>.collectAsLazyPagingItemsWithLifecycle( + context: CoroutineContext = EmptyCoroutineContext +): LazyPagingItems { + val lifecycle = LocalLifecycleOwner.current.lifecycle + return remember(this, lifecycle) { + flowWithLifecycle(lifecycle) + }.collectAsLazyPagingItems(context) +} \ No newline at end of file diff --git a/app/src/main/java/com/skyd/rays/model/respository/SearchRepository.kt b/app/src/main/java/com/skyd/rays/model/respository/SearchRepository.kt index 23d5cb9..806a867 100644 --- a/app/src/main/java/com/skyd/rays/model/respository/SearchRepository.kt +++ b/app/src/main/java/com/skyd/rays/model/respository/SearchRepository.kt @@ -78,8 +78,8 @@ class SearchRepository @Inject constructor( fun requestStickerWithTagsListWithAllSearchDomain(keyword: String): Flow> { return flow { emit(genSql(k = keyword, useSearchDomain = { _, _ -> true })) } - .flowOn(Dispatchers.IO) .flatMapLatest { Pager(pagingConfig) { stickerDao.getStickerWithTagsPaging(it) }.flow } + .flowOn(Dispatchers.IO) } data class SearchResult( diff --git a/app/src/main/java/com/skyd/rays/ui/screen/stickerslist/StickersListScreen.kt b/app/src/main/java/com/skyd/rays/ui/screen/stickerslist/StickersListScreen.kt index 6566ae0..865d423 100644 --- a/app/src/main/java/com/skyd/rays/ui/screen/stickerslist/StickersListScreen.kt +++ b/app/src/main/java/com/skyd/rays/ui/screen/stickerslist/StickersListScreen.kt @@ -27,6 +27,7 @@ import androidx.paging.compose.collectAsLazyPagingItems import com.skyd.rays.R import com.skyd.rays.base.mvi.MviEventListener import com.skyd.rays.base.mvi.getDispatcher +import com.skyd.rays.ext.collectAsLazyPagingItemsWithLifecycle import com.skyd.rays.ext.navigate import com.skyd.rays.ext.plus import com.skyd.rays.model.bean.StickerWithTags @@ -94,7 +95,8 @@ fun StickersListScreen(query: String, viewModel: StickersListViewModel = hiltVie when (val listState = uiState.listState) { ListState.Init -> Unit is ListState.Success -> { - val lazyPagingItems = listState.stickerWithTagsPagingFlow.collectAsLazyPagingItems() + val lazyPagingItems = + listState.stickerWithTagsPagingFlow.collectAsLazyPagingItemsWithLifecycle() StickerList( count = lazyPagingItems.itemCount, data = { lazyPagingItems[it]!! },