0

I have this in MainActivity:

@Composable
fun createNavHost(paddingValues: PaddingValues, navController: NavHostController) {
    NavHost(navController, startDestination = Screen.HomeScreen.title) {
        composable(Screen.HomeScreen.title) {
            HomeScreen(
                accountSelected = {
                    navController.navigate(Screen.PasswordDetailScreen.title + "/${it.id}")
                })
        }
        composable(Screen.EditPasswordScreen.title) {
            EditPasswordScreen()
        }
    }
}

My layout is defined thusly:

@Composable
fun MainLayout() {
    val navController = rememberNavController()

    PasswordHelperTheme {
        Scaffold(
        ) { paddingValues ->
            createNavHost(paddingValues, navController)
        }
    }
}

The screens are defined this way:

sealed class Screen(val title: String) {
    object HomeScreen : Screen("Home")
    object SettingsScreen : Screen("Settings")
    object EditPasswordScreen : Screen("Edit")
    object PasswordDetailScreen: Screen("ArticleDetail")
}

I call

@Composable fun AddAccountFAB() { val context = LocalContext val navController = rememberNavController()

ExtendedFloatingActionButton(
    shape = CircleShape,
    icon = { Icon(Icons.Filled.Add, "") },
    onClick = {
        navController.graph = navController.graph
        navController.navigate(MainActivity.Screen.EditPasswordScreen.title) {
            popUpTo = navController.graph.startDestination
            launchSingleTop = true
        }
    },
    elevation = FloatingActionButtonDefaults.elevation(8.dp),
    text = { Text("Add Account")}
)

and get

java.lang.IllegalStateException: You must call setGraph() before calling getGraph()
        at androidx.navigation.NavController.getGraph(NavController.java:812)
        at com.blackfox.passwordhelper.android.HomeScreenKt$AddAccountFAB$1$1.invoke(HomeScreen.kt:79)

I thought createNavHost was setting up the graph. This at least gets me past the deep link exception. I am just trying to use the FAB to go to a page.

Róbert Nagy
  • 6,720
  • 26
  • 45
James Black
  • 41,583
  • 10
  • 86
  • 166

2 Answers2

1

It appears the only real option is to set up a route in the navHost.

NavHost(navController, startDestination = Screen.HomeScreen.title) {
        composable(Screen.HomeScreen.title) {
            HomeScreen(
                accountSelected = {
                    navController.navigate(Screen.PasswordDetailScreen.title + "/${it.id}")
                },
                fabSelected = {
                    navController.navigate(Screen.EditPasswordScreen.title + "/${it.id}")
                })
        }
        composable(Screen.EditPasswordScreen.title + "/-1") {
            EditPasswordScreen()
        }
    }

The this works:

ExtendedFloatingActionButton(
    shape = CircleShape,
    icon = { Icon(Icons.Filled.Add, "") },
    onClick = {
        fabSelected(Passwords(-1, "", "", "", "", ""))
    },
    elevation = FloatingActionButtonDefaults.elevation(8.dp),
    text = { Text("Add Account")}
)
James Black
  • 41,583
  • 10
  • 86
  • 166
0

Try removing

navController.graph = navController.graph
Brady
  • 63
  • 4
  • When I remove it then I get, and the only change was removing the one line. java.lang.IllegalStateException: You must call setGraph() before calling getGraph() at androidx.navigation.NavController.getGraph(NavController.java:812) at com.blackfox.passwordhelper.android.HomeScreenKt$AddAccountFAB$1$1.invoke(HomeScreen.kt:80) – James Black May 17 '21 at 22:46