diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt index c3a933570..b6a903e8c 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/FabLayout.kt @@ -129,10 +129,10 @@ fun FabLayout( } val builder by rememberUpdatedState(fabBuilder) - val secondaryFab by delegateSnapshotUpdate { - record { buildFab(builder) } - transform { onEachLatest { state.collapse(MutatePriority.PreventUserInput) } } - } + val secondaryFab by delegateSnapshotUpdate( + record = { buildFab(builder) }, + transform = { onEachLatest { state.collapse(MutatePriority.PreventUserInput) } }, + ) val density = LocalDensity.current val interval = remember(density) { with(density) { FabInterval.roundToPx() } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt index 6b444cc8c..d1f83e217 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/DownloadsScreen.kt @@ -633,15 +633,14 @@ fun AnimatedVisibilityScope.DownloadsScreen(navigator: DestinationsNavigator) = } } - val hideFab by delegateSnapshotUpdate { - record { fabHidden } - transform { - // Bug: IDE failed to inference 'hide's type - onEachLatest { hide: Boolean -> + val hideFab by delegateSnapshotUpdate( + record = { fabHidden }, + transform = { + onEachLatest { hide -> if (!hide) delay(FAB_ANIMATE_TIME.toLong()) } - } - } + }, + ) FabLayout( hidden = hideFab && !selectMode, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt index b9d476412..294c666c6 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/FavoritesScreen.kt @@ -331,15 +331,14 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) = ) } - val hideFab by delegateSnapshotUpdate { - record { fabHidden } - transform { - // Bug: IDE failed to inference 'hide's type + val hideFab by delegateSnapshotUpdate( + record = { fabHidden }, + transform = { onEachLatest { hide: Boolean -> if (!hide) delay(FAB_ANIMATE_TIME.toLong()) } - } - } + }, + ) FabLayout( hidden = hideFab && !selectMode, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index d24453c1b..6396f9d04 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -595,15 +595,14 @@ fun AnimatedVisibilityScope.GalleryListScreen(lub: ListUrlBuilder, navigator: De val invalidNum = stringResource(R.string.error_invalid_number) val outOfRange = stringResource(R.string.error_out_of_range) - val hideFab by delegateSnapshotUpdate { - record { fabHidden } - transform { - // Bug: IDE failed to inference 'hide's type + val hideFab by delegateSnapshotUpdate( + record = { fabHidden }, + transform = { onEachLatest { hide: Boolean -> if (!hide) delay(FAB_ANIMATE_TIME.toLong()) } - } - } + }, + ) FabLayout( hidden = hideFab, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SnapshotFlowState.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SnapshotFlowState.kt index 6a99bb711..b975b6b16 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SnapshotFlowState.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/SnapshotFlowState.kt @@ -1,32 +1,18 @@ package com.hippo.ehviewer.ui.tools import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshots.Snapshot import kotlinx.coroutines.flow.Flow -interface RecordSnapshotScope { - fun record(block: () -> T) - fun transform(block: Flow.() -> Flow) -} - @Composable -fun delegateSnapshotUpdate(dsl: RecordSnapshotScope.() -> Unit): State { - val state = remember(dsl) { - object : RecordSnapshotScope { - lateinit var flow: Flow - lateinit var initial: T - override fun record(block: () -> T) { - initial = Snapshot.withoutReadObservation(block) - flow = snapshotFlow(block) - } - override fun transform(block: Flow.() -> Flow) { - flow = block(flow) - } - }.apply(dsl) - } - return with(state) { flow.collectAsState(initial) } +fun delegateSnapshotUpdate( + record: () -> T, + transform: Flow.() -> Flow = { this }, +) = remember(transform, record) { + Snapshot.withoutReadObservation(record) to transform(snapshotFlow(record)) +}.let { (initial, flow) -> + flow.collectAsState(initial) }