Joe Altidore
07/16/2024, 11:31 PMjava.lang.IllegalArgumentException: Cannot cast taxPayer of type com.nugitech.crptax.home.domain.model.TaxPayer to a NavType. Make sure to provide custom NavType for this argument.
Ian Lake
07/16/2024, 11:33 PMtypeMap
?Joe Altidore
07/16/2024, 11:41 PMJoe Altidore
07/16/2024, 11:41 PMIan Lake
07/16/2024, 11:41 PMJoe Altidore
07/16/2024, 11:46 PMIan Lake
07/16/2024, 11:47 PMIan Lake
07/16/2024, 11:49 PMJoe Altidore
07/16/2024, 11:53 PMinline fun <reified T : Parcelable> parcelableType(
isNullableAllowed: Boolean = false,
json: Json = Json,
) = object : NavType<T>(isNullableAllowed = isNullableAllowed) {
override fun get(bundle: Bundle, key: String) =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
bundle.getParcelable(key, T::class.java)
} else {
@Suppress("DEPRECATION")
bundle.getParcelable(key)
}
override fun parseValue(value: String): T = json.decodeFromString(value)
override fun serializeAsValue(value: T): String = json.encodeToString(value)
override fun put(bundle: Bundle, key: String, value: T) = bundle.putParcelable(key, value)
}
My Navigation graph
fun NavGraphBuilder.assessmentGraph(
navigator: NavHostController, snackbar: SnackbarHostState
) {
composable<AssessmentGraph.Assessment> (
typeMap = mapOf(typeOf<TaxPayer>() to parcelableType<TaxPayer>())
){
val route = it.toRoute<AssessmentGraph.Assessment>()
AssessmentScreen(snackbar = snackbar, taxPayer = route.taxPayer) {
}
}
}
However, when I pass assessmentGraph to the Navhost, the app crashes with the error below
java.lang.IllegalArgumentException: No destination with route com.nugitech.crptax.home.presentation.screenGraphs.HomeGraph/{route} is on the NavController's back stack. The current destination is Destination(0xea762c48) route=com.nugitech.crptax.auth.presentation.screenGraphs.AuthGraph.SplashScreen
PS. When I remove the assessmentGraph, the app runs fineIan Lake
07/16/2024, 11:56 PMJoe Altidore
07/17/2024, 12:05 AMJoe Altidore
07/17/2024, 12:05 AMJoe Altidore
07/17/2024, 12:13 AMIan Lake
07/17/2024, 12:26 AMJoe Altidore
07/17/2024, 12:29 AMJoe Altidore
07/17/2024, 12:29 AMIan Lake
07/17/2024, 12:36 AMSplashScreen
is trying to access HomeGraph
Joe Altidore
07/17/2024, 12:37 AMJoe Altidore
07/17/2024, 12:38 AMIan Lake
07/17/2024, 12:39 AMJoe Altidore
07/17/2024, 12:45 AMjava.lang.IllegalArgumentException: No destination with route com.nugitech.crptax.home.presentation.screenGraphs.HomeGraph/{route} is on the NavController's back stack. The current destination is Destination(0xea762c48) route=com.nugitech.crptax.auth.presentation.screenGraphs.AuthGraph.SplashScreen
at androidx.navigation.NavController.getBackStackEntry(NavController.kt:2629)
at com.nugitech.crptax.home.presentation.screenGraphs.HomeGraphKt$homeGraph$1$1.invoke(HomeGraph.kt:76)
at com.nugitech.crptax.home.presentation.screenGraphs.HomeGraphKt$homeGraph$1$1.invoke(HomeGraph.kt:24)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.navigation.compose.NavHostKt$NavHost$32$1.invoke(NavHost.kt:694)
at androidx.navigation.compose.NavHostKt$NavHost$32$1.invoke(NavHost.kt:693)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:401)
at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:85)
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:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:380)
at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
at androidx.navigation.compose.NavHostKt$NavHost$32.invoke(NavHost.kt:693)
at androidx.navigation.compose.NavHostKt$NavHost$32.invoke(NavHost.kt:674)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:803)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:792)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:771)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:774)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:757)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt.AnimatedContent(AnimatedContent.kt:816)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:646)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:356)
at com.nugitech.crptax.MainActivity$onCreate$1$2$1$3.invoke(MainActivity.kt:217)
at com.nugitech.crptax.MainActivity$onCreate$1$2$1$3.invoke(MainActivity.kt:216)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118) AndroidRuntime at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:130) (Ask Gemini)
at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:129)
at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:192)
at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2823)
at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:3114)
at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3605)
at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3550)
at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:948)
at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1198)
at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:132)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:609)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:578)
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:1229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:827)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@dca5b, androidx.compose.ui.platform.MotionDurationScaleImpl@6e912f8, StandaloneCoroutine{Cancelling}@8d4d3d1, AndroidUiDispatcher@fce0e36]
Joe Altidore
07/17/2024, 12:46 AMLaunchedEffect(key1 = viewModel){
viewModel.init().let{
if(it){
navigator.navigate(HomeGraph.Home){
popUpTo(AuthGraph.SplashScreen){
inclusive = true
}
}
}else{
navigator.navigate(AuthGraph.LoginScreen){
popUpTo(AuthGraph.SplashScreen){
inclusive = true
}
}
}
}
}
`Joe Altidore
07/17/2024, 12:47 AMNavHost(
modifier = Modifier.padding(innerPadding),
navController = navigator,
startDestination = AuthGraph.SplashScreen
) {
assessmentGraph(navigator, snackbar)
authNavigation(snackbar = snackbar, navigator = navigator)
homeGraph(navigator, snackbar)
}
Ian Lake
07/17/2024, 12:49 AMJoe Altidore
07/17/2024, 12:50 AMassessmentGraph(navigator, snackbar)
from the NavHost, everything works fineIan Lake
07/17/2024, 12:51 AMJoe Altidore
07/17/2024, 12:53 AMassessmentGraph(navigator, snackbar)
to the NavHost. If I remove it or change the parameter to primitive type, everything works fineIan Lake
07/17/2024, 12:56 AMJoe Altidore
07/17/2024, 1:05 AMnavigator.addOnDestinationChangedListener{controller, _, _ ->
controller.currentBackStackEntry?.fromRoute()?.let {
viewModel.setScreenRoute(it)
}
}
This is where I suspect it is happening
fun NavBackStackEntry?.fromRoute(): Screen {
this?.destination?.route?.substringBefore("?")?.substringBefore("/")
?.substringAfterLast(".")?.let {
return when (it) {
AuthGraph.SplashScreen::class.simpleName -> AuthGraph.SplashScreen
AuthGraph.LoginScreen::class.simpleName -> AuthGraph.LoginScreen
HomeGraph::class.simpleName -> HomeGraph.Home
HomeGraph.Home::class.simpleName -> HomeGraph.Home
HomeGraph.History::class.simpleName -> HomeGraph.History
AssessmentGraph.Assessment::class.simpleName -> AssessmentGraph("Assessment")
else -> HomeGraph.Home
}
}
return HomeGraph.Home
}
Ian Lake
07/17/2024, 1:44 AMcurrentBackStackEntryAsState
+ LaunchedEffect
and using hasRoute
to figure out which route you are on), but that code has nothing to do with your stack trace, which is coming from the composition of SplashScreen
Joe Altidore
07/17/2024, 8:18 AMdawidhyzy
09/12/2024, 7:26 AM