我的应用程序中有这样的代码:

@Composable
fun LogInScreen(
    navController: NavHostController,
) {
    val backStackEntry = remember(navController.currentBackStackEntry) {
        navController.getBackStackEntry(MainAppNavOptions.AuthScreen.name)
    }
    val viewModel: AuthViewModel = hiltViewModel(backStackEntry)
    ...
    LaunchedEffect(key1 = viewModel.isUserSignInState.value){
        if (viewModel.isUserSignInState.value){
            navController.navigate(MainAppNavOptions.MainScreen.name){
                popUpTo(MainAppNavOptions.MainScreen.name){
                    inclusive = true
                }
            }
        }
    }
    ...
}

所以在这里,我得到了身份验证屏幕的共享视图模型,然后在成功登录后导航到我的主屏幕.

但看起来好像LogInScreen函数又运行了一次,因为我正在弹出后台堆栈,它无法获得视图模型并抛出一个错误:

    java.lang.IllegalArgumentException: No destination with route AuthScreen is on the NavController's back stack. The current destination is Destination(0x532bad98) route=HomeScreen
at androidx.navigation.NavController.getBackStackEntry(NavController.kt:2440)
at com.elog.findnchat.ui.auth.login.LogInScreenKt.LogInScreen(LogInScreen.kt:55)
at com.elog.findnchat.ui.navigation.NavGraphKt$authScreens$1$2.invoke(navGraph.kt:204)
at com.elog.findnchat.ui.navigation.NavGraphKt$authScreens$1$2.invoke(navGraph.kt:203)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:138)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.navigation.compose.NavHostKt$NavHost$14$1.invoke(NavHost.kt:320)
at androidx.navigation.compose.NavHostKt$NavHost$14$1.invoke(NavHost.kt:318)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:108)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65)
at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52)
at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:108)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:318)
at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:302)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:138)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$4.invoke(AnimatedContent.kt:780)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$4.invoke(AnimatedContent.kt:769)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:117)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:941)
at androidx.compose.animation.AnimatedVisibilityKt.AnimatedVisibility(AnimatedVisibility.kt:607)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:757)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:740)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:108)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt.AnimatedContent(AnimatedContent.kt:794)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:280)
at androidx.navigation.compose.NavHostKt$NavHost$16.invoke(Unknown Source:27)
at androidx.navigation.compose.NavHostKt$NavHost$16.invoke(Unknown Source:10)
at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:169)
at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2468)
2023-08-28 19:15:51.868  7084-7084  AndroidRuntime          com.elog.findnchat                   E      at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2737)
at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3352)
at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3303)
at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:781)
at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1097)
at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:124)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:569)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:537)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:970)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:727)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7698)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@9e62ed5, androidx.compose.ui.platform.MotionDurationScaleImpl@70506ea, StandaloneCoroutine{Cancelling}@83b6ddb, AndroidUiDispatcher@f28b078]

以下是一些注意事项:

  • 是的,如果我不弹出堆栈,它是有效的,但它是必需品
  • 我试过加if (viewModel.isUserSignInState.value) return,但我认为这不是最好的办法……

推荐答案

使用remember(navController.currentBackStackEntry)键是错误的,因为只要弹出,该字段就会立即失效.

在构建图形时,您应该使用composable函数为您提供的navBackStackEntry-这确保了由于退出过渡而进行的重组即使在弹出发生时仍保持其状态.

通过使用正确的键,在您退出时不会再次呼叫getBackStackEntry呼叫,从而允许您在屏幕退出时继续使用该数据.

Android相关问答推荐

使用StateFlow从房间到UiState的流程列表

Kotlin多平台向导,不兼容版本(ANP 8.2.0)ANP 8.1.2

我到底应该如何分享我的应用程序中的图片?

在以XML格式设置完整屏幕视图时可见App Compat按钮

StateFlow和LazyColumn重组

如何防止在Android Studio中设置kotlin断点时优化变量

Jetpack Compose:如何将文本放置在行的右侧?

SDK 33 的问题 - 面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

如何只允许拖动 BottomSheetScaffold 中 BottomContent 的 SheetPeek 的一部分?

android xml底部空间大

如何在 compose 中使用 BottomSheetScaffold 为底页设置半展开高度?

如何使用jetpack compose实现布局,其中图标在列布局上是绝对位置

Kotlin Compose 全局页脚视图

线圈单元测试 - 如何做到这一点?

在 Compose 中使用 DeepLink 会导致无法向后导航

Android全屏AlertDialog

更新应用程序是否会取消对应用程序特定文件的权限?

ObjectBox,如何在冲突中放弃一切迁移?

如何使伴奏导航 BottomSheet 完全展开?