Niklas Bolwede
03/15/2022, 9:11 PMjava.lang.IllegalStateException: Restoring the Navigation back stack failed: destination -1666506032 cannot be found from the current destination Destination(0xcf551cdb) route=SettingsNavGraph
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)
@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)
}
}
}
}
}
@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,
)
}
}
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,
)
}
}
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)
}
}
}
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"),
}
}
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'