Получение исключения глубинной ссылки при переходе с одного экрана Android на другой

У меня это в 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()
        }
    }
}

Мой макет определяется следующим образом:

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

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

Экраны определяются следующим образом:

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

Я звоню

@Composablefun 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")}
)

и получить

      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)

я думал createNavHostнастраивал график. Это, по крайней мере, позволяет мне пройти исключение для глубинной ссылки. Я просто пытаюсь использовать FAB, чтобы перейти на страницу.

2 ответа

Похоже, единственный реальный вариант - создать route в 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()
        }
    }

Это работает:

      ExtendedFloatingActionButton(
    shape = CircleShape,
    icon = { Icon(Icons.Filled.Add, "") },
    onClick = {
        fabSelected(Passwords(-1, "", "", "", "", ""))
    },
    elevation = FloatingActionButtonDefaults.elevation(8.dp),
    text = { Text("Add Account")}
)

Попробуйте удалить

      navController.graph = navController.graph
Другие вопросы по тегам