From 3bf6f763aac1f3ea2b49d755e7fbbd0a71f30eca Mon Sep 17 00:00:00 2001 From: Dude so hot Date: Sun, 13 Oct 2024 20:38:24 +0800 Subject: [PATCH] Optimise DialogState with value class --- .../kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt | 12 +++++++----- .../main/kotlin/com/hippo/ehviewer/util/Progress.kt | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt index d68548e9d..0f247854e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -51,6 +51,7 @@ import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -95,18 +96,19 @@ fun interface DismissDialogScope { fun dismissWith(value: R) } -class DialogState { - var content: (@Composable () -> Unit)? by mutableStateOf(null) +typealias MutableComposable = MutableState<(@Composable () -> Unit)?> +@JvmInline +value class DialogState(val field: MutableComposable = mutableStateOf(null)) : MutableComposable by field { @Composable - fun Intercept() = content?.invoke() + fun Intercept() = value?.invoke() fun dismiss() { - content = null + value = null } suspend inline fun dialog(crossinline block: @Composable (CancellableContinuation) -> Unit) = try { - suspendCancellableCoroutine { cont -> content = { block(cont) } } + suspendCancellableCoroutine { cont -> value = { block(cont) } } } finally { dismiss() } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt index 120a649bc..ed07a79d5 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/Progress.kt @@ -49,7 +49,7 @@ fun ProgressDialog() { suspend fun DialogState.bgWork(work: suspend () -> R) = try { suspendCoroutineUninterceptedOrReturn { cont -> work.startCoroutineUninterceptedOrReturn(cont).also { r -> - if (r == COROUTINE_SUSPENDED) content = { ProgressDialog() } + if (r == COROUTINE_SUSPENDED) value = { ProgressDialog() } } } } finally {