https://kotlinlang.org logo
Title
n

Niklas Bolwede

03/15/2022, 9:11 PM
How can i solve this exception with my navGraphs on orientation change? I do not get this error when top/starting navGraph.
java.lang.IllegalStateException: Restoring the Navigation back stack failed: destination -1666506032 cannot be found from the current destination Destination(0xcf551cdb) route=SettingsNavGraph
Error:
Process: com.example.testapp, PID: 4498
    java.lang.IllegalStateException: Restoring the Navigation back stack failed: destination -1666506032 cannot be found from the current destination Destination(0xcf551cdb) route=SettingsNavGraph
        at androidx.navigation.NavController.onGraphCreated(NavController.kt:1125)
        at androidx.navigation.NavController.setGraph(NavController.kt:1086)
        at androidx.navigation.NavController.setGraph(NavController.kt:100)
        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:120)
        at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:69)
        at com.example.testapp.navigation.NavGraphKt.SetupNavGraph(NavGraph.kt:38)
        at com.example.testapp.MainActivity$onCreate$1$1$1.invoke(MainActivity.kt:45)
        at com.example.testapp.MainActivity$onCreate$1$1$1.invoke(MainActivity.kt:44)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:268)
        at androidx.compose.material.SurfaceKt$Surface$6.invoke(Surface.kt:255)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:252)
        at androidx.compose.material.SurfaceKt.Surface-F-jzlyU(Surface.kt:110)
        at com.example.testapp.MainActivity$onCreate$1$1.invoke(MainActivity.kt:41)
        at com.example.testapp.MainActivity$onCreate$1$1.invoke(MainActivity.kt:39)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at com.example.testapp.ui.theme.ThemeKt$AppTheme$2.invoke(Theme.kt:72)
        at com.example.testapp.ui.theme.ThemeKt$AppTheme$2.invoke(Theme.kt:71)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.material.MaterialTheme_androidKt.PlatformMaterialTheme(MaterialTheme.android.kt:23)
        at androidx.compose.material.MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:82)
        at androidx.compose.material.MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:81)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.compose.material.TextKt.ProvideTextStyle(Text.kt:265)
        at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81)
        at androidx.compose.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
        at androidx.compose.material.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:72)
        at com.example.testapp.ui.theme.ThemeKt.AppTheme(Theme.kt:67)
        at com.example.testapp.MainActivity$onCreate$1.invoke(MainActivity.kt:39)
        at com.example.testapp.MainActivity$onCreate$1.invoke(MainActivity.kt:38)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
        at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:410)
MainActivity.kt:
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    private val appVM: AppViewModel by viewModels()

    override fun attachBaseContext(base: Context) {
        LocaleHelper().setLocale(base, LocaleHelper().getLanguage(base))
        super.attachBaseContext(LocaleHelper().onAttach(base))
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


        setContent {
            AppTheme(darkTheme = false) {
                val navController = rememberNavController()
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    SetupNavGraph(navController = navController, appVM = appVM)
                }
            }

        }
    }

}
NavGraph.kt
@Composable
fun SetupNavGraph(
    navController: NavHostController, appVM: AppViewModel
) {
    LaunchedEffect("navigation") {
        appVM._navigator.sharedFlow.onEach {
            navController.navigate(it.label)
        }.launchIn(this)
    }
    NavHost(
        navController = navController,
        startDestination = Navigator.NavGraphRoot.MainMenuNavGraph.root,
        route = Navigator.NavGraphRoot.NavHostRoot.root
    ) {

        mainMenuNavGraph(
            appVM = appVM,
            navController = navController
        )

        settingsNavGraph(
            appVM = appVM,
            navController = navController,
        )
    }
}
MainMenuNavGraph.kt:
un NavGraphBuilder.mainMenuNavGraph(
    navController: NavHostController,
    appVM: AppViewModel
) {

    navigation(
        startDestination = Navigator.NavTarget.MainMenu.label,
        route = Navigator.NavGraphRoot.MainMenuNavGraph.root
    ) {
        composable(
            route = Navigator.NavTarget.MainMenu.label
        ) {
            MainMenuView(appVM = appVM)
        }
        
        composable(
            route = Navigator.NavTarget.Test.label
        ) {
            TestView(appVM = appVM)
        }
        composable(
            route = Navigator.NavGraphRoot.SettingsNavGraph.root,
        )
    }
}
SettingsNavGraph.kt:
fun NavGraphBuilder.settingsNavGraph(
    navController: NavHostController,
    appVM: AppViewModel,

){
    navigation(
        startDestination = Navigator.NavTarget.Settings.label,
        route = Navigator.NavGraphRoot.SettingsNavGraph.root
    ){

        composable(
            route = Navigator.NavTarget.Settings.label,
        ) {
            val navGraphEntry = remember {navController.getBackStackEntry(Navigator.NavGraphRoot.SettingsNavGraph.root)}
            val graphViewModel = hiltViewModel<SettingsViewModel>(navGraphEntry)
            SettingsView(appVM = appVM, settingsVM = graphViewModel)
        }
        composable(
            route = Navigator.NavTarget.UserSettings.label
        ) {
            val navGraphEntry = remember {navController.getBackStackEntry(Navigator.NavGraphRoot.SettingsNavGraph.root)}
            val graphViewModel = hiltViewModel<SettingsViewModel>(navGraphEntry)
            UserSettingsView(appVM = appVM, settingsVM = graphViewModel)
        }
        composable(
            route = Navigator.NavTarget.LanguageSettings.label
        ) {
            val navGraphEntry = remember {navController.getBackStackEntry(Navigator.NavGraphRoot.SettingsNavGraph.root)}
            val graphViewModel = hiltViewModel<SettingsViewModel>(navGraphEntry)
            LanguageSettingsView(appVM = appVM, settingsVM = graphViewModel)
        }

    }
}
Navigation.kt
class Navigator @Inject constructor(){

    private val _sharedFlow =
        MutableSharedFlow<NavTarget>(extraBufferCapacity = 1)
    val sharedFlow = _sharedFlow.asSharedFlow()

    fun navigateTo(navTarget: NavTarget) {
        _sharedFlow.tryEmit(navTarget)
    }

    enum class NavTarget(val label: String) {

        MainMenu("MainMenu"),
        Settings("Settings"),
        Test("Test"),
        UserSettings("UserSettings"),
        LanguageSettings("LanguageSettings"),
    }

    enum class NavGraphRoot(val root: String) {
        NavHostRoot("NavHostRoot"),
        MainMenuNavGraph("MainMenuNavGraph"),
        SettingsNavGraph("SettingsNavGraph"),
    }
}
Dependencies:
implementation 'androidx.core:core-ktx:1.7.0'
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.material:material:$compose_version"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
    implementation 'androidx.activity:activity-compose:1.4.0'

    implementation "com.google.accompanist:accompanist-systemuicontroller:0.23.1"

    implementation "androidx.navigation:navigation-compose:2.4.1"

    //hilt
    implementation "com.google.dagger:hilt-android:2.38.1"
    kapt "com.google.dagger:hilt-compiler:2.38.1"
    implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'