androidx.navigation.NavGraph 不能转换为 androidx.navigation.compose.ComposeNavigator$Destination

Has*_*ssa 6 android kotlin android-jetpack-compose

将导航组合依赖从2.4.0-alpha03更新到2.4.0-alpha05 后,我在尝试在可组合屏幕之间导航后遇到了这个奇怪的错误(例如从 taskComposable 导航到 listComposable 屏幕)。这是我的代码的一部分。

主要活动:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

    private lateinit var navController: NavHostController

    @ExperimentalAnimationApi
    @ExperimentalMaterialApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyComposeDemoTheme {
                navController = rememberNavController()
                SetupNavigation(
                    navController = navController
                )
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

设置导航:

@ExperimentalAnimationApi
@ExperimentalMaterialApi
@Composable
fun SetupNavigation(
    navController: NavHostController
) {
    val screen = remember(navController) { Screens(navController) }

    NavHost(
        navController = navController,
        startDestination = "list/{action}"
    ) {
        listComposable(
            navigateToTaskScreen = screen.task
        )
        taskComposable(
            navigateToListScreen = screen.list
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

屏幕:

class Screens(navController: NavHostController) {
    val list: (Action) -> Unit = { action ->
        navController.navigate("list/${action.name}"){
            popUpTo(LIST_SCREEN) { inclusive = true }
        }
    }
    val task: (Int) -> Unit = { taskId ->
        navController.navigate("task/$taskId")
    }
}
Run Code Online (Sandbox Code Playgroud)

任务可组合

fun NavGraphBuilder.taskComposable(
    navigateToListScreen: (Action) -> Unit
) {
    composable(
        route = TASK_SCREEN,
        arguments = listOf(navArgument(TASK_ID_ARGUMENT_KEY) {
            type = NavType.IntType
        })
    ) {
        TaskScreen(
            navigateToListScreen = navigateToListScreen
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

进程:com.example.mycomposedemo,PID:2413 java.lang.ClassCastException:androidx.navigation.NavGraph 无法转换为 androidx.navigation.compose.ComposeNavigator$Destination at androidx.navigation.compose.NavHostKt$NavHost$6$1.invoke( NavHost.kt:146) 在 androidx.navigation.compose.NavHostKt$NavHost$6$1.invoke(NavHost.kt:145) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) at androidx.compose.runtime.saveable.SaveableStateHolderImplerStateProvider(HolderStateProvider) .kt:84) 在 androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:59) 在 androidx。androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51) 的navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1) androidx.navigation.compose.Kt.NavokeStackLocalOwnersProviderinvoke(NavBackStackEntryProvider.Kt:51)(NavBackStackEntryProvider.kt:1) NavBackStackEntryProvider.kt:50) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt: androidx.compose.runtime.internal.ComposableLambdaImpl.invoke) .compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215) 在 androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:46) 在 androidx.navigation.compose.NavHostKt$NavHost$6.avHostKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:46) 145)在androidx.navigation.compose。NavHostKt$NavHost$6.invoke(NavHost.kt:144) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116) 在 androidx.compose.runtime.internal.ComposableLambdaImplable.invoke(ComposableLambdaImplable.invoke(ComposableLambdaImplable) .kt:34) 在 androidx.compose.animation.CrossfadeKt$Crossfade$1$1.invoke(Crossfade.kt:74) 在 androidx.compose.animation.CrossfadeKt$Crossfade$1$1.invoke(Crossfade.kt:69) 在compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 androidx.compose.animation.Crossfadet(Crossfadet) Crossfade.kt:86) at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:144) at androidx.navigation.compose.NavHostKt$NavHost$7.invoke(Unknown Source:13) at androidx.navigation.compose.NavHostKt $NavHost$7。invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:140) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2156) at androidx.compose.runtime.ComposerImpl。 skipCurrentGroup(Composer.kt:2399) 在 androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2580) 在 androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2573)在 androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotState.kt:540) 在 androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2566) 在 androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt) :2542) 在 androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:613) 在 androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:764) 在 androidx.compose.runtime。Recomposer.access$performRecompose(Recomposer.kt:103) 在 androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:447) 在 androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer. kt:416) 在 androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34) 在 androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt: 109) 2021-07-29 10:00:14.416 2413-2413/com.example.mycomposedemo E/AndroidRuntime:在 androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41) .compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:964) 在 android.view.Choreographer.doCallbacks(Choreographer.java:790) 在 android.view.Choreographer.doFrame(Choreographer.java:721) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951) 在android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread .main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:930)Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread) .java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit .main(ZygoteInit.java:930)Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread) .java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit .main(ZygoteInit.java:930)

小智 5

这是一个内部错误,将在 Navigation 2.4.0-alpha06 版本中修复。@headsvk 分享了问题链接:https ://issuetracker.google.com/issues/194301889