diff --git a/app/src/main/java/com/hippo/ehviewer/ui/compose/RememberGlobally.kt b/app/src/main/java/com/hippo/ehviewer/ui/compose/RememberGlobally.kt new file mode 100644 index 000000000..53006df56 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/compose/RememberGlobally.kt @@ -0,0 +1,34 @@ +package com.hippo.ehviewer.ui.compose + +import androidx.collection.lruCache +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.currentCompositeKeyHash +import androidx.compose.runtime.remember + +private val remembered = lruCache(1) + +@Composable +fun rememberGlobally( + vararg inputs: Any?, + key: String? = null, + init: () -> T, +): T { + // key is the one provided by the user or the one generated by the compose runtime + val finalKey = if (!key.isNullOrEmpty()) { + key + } else { + currentCompositeKeyHash.toString(36) + } + // value is restored using the registry or created via [init] lambda + val value = remember(*inputs) { + @Suppress("UNCHECKED_CAST") + val restored = remembered[finalKey] as? T + restored ?: init() + } + + LaunchedEffect(finalKey) { + remembered.put(finalKey, value) + } + return value +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt index e092e432b..b9563e6a4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewScreen.kt @@ -57,6 +57,7 @@ import com.hippo.ehviewer.coil.imageRequest import com.hippo.ehviewer.coil.justDownload import com.hippo.ehviewer.ui.compose.data.EhPreviewItem import com.hippo.ehviewer.ui.compose.rememberDialogState +import com.hippo.ehviewer.ui.compose.rememberGlobally import com.hippo.ehviewer.ui.compose.setMD3Content import com.hippo.ehviewer.ui.legacy.recyclerview.calculateSuitableSpanCount import com.hippo.ehviewer.ui.navToReader @@ -118,7 +119,7 @@ class GalleryPreviewScreen : Fragment() { initialKey = goto } - val previewPagesMap = remember { mutableMapOf().apply { put(1, galleryDetail.previewList) } } + val previewPagesMap = rememberGlobally { mutableMapOf().apply { put(1, galleryDetail.previewList) } } val data = remember(initialKey) { Pager(PagingConfig(1, prefetchDistance = 4, enablePlaceholders = false, initialLoadSize = 1), initialKey) { object : PagingSource() {