Este é meu primeiro aplicativo para Android. Atualmente, estou trabalhando na parte de navegação. O problema é que, sempre que clico IconButton
para navegar para a tela Adicionar Notas, o aplicativo trava com esta exceção:
java.lang.IllegalStateException: You must call setGraph() before calling getGraph()
Na minha MainActivity, tenho este código:
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = Home,
) {
composable<Home> {
TopBar()
}
composable<AddNote> {
// add Notes here
}
}
E estes são os destinos de navegação que eu uso:
@Serializable
object Home
@Serializable
object AddNote
Esta é uma versão condensada da minha TopBar para onde desejo navegar AddNote
quando o botão for clicado:
@Composable
fun TopBar() {
//navigate through screens
val navController = rememberNavController()
// IconButton to handle the add note action
IconButton(onClick = { navController.navigate(AddNote) }) {
Icon(
imageVector = Icons.Rounded.Add,
contentDescription = "Add Note",
)
}
}
Seu aplicativo trava porque o endereço
navController
que você usa para navegarAddNote
não é o mesmo que você usou para criar seu NavHost.Como o navController nunca deve ser passado adiante (ele deve ficar confinado ao NavHost), você deve passar um lambda para o TopBar, assim:
O novo parâmetro é uma função que pode ser executada pelo TopBar. Na função, o navController é usado para a navegação, mas o TopBar nunca tem acesso ao navController em si, podendo apenas executar a função como um todo:
Ah, já vi isso antes. O motivo da falha é que você está criando um novo NavController dentro de TopBar(). Ele não tem conexão com o da MainActivity. Então, quando você tenta navegar para AddNote, o aplicativo não sabe para onde você está tentando ir.
A solução é passar o navController de MainActivity para TopBar().
Dentro do seu composable TopBar(), não crie um novo NavController, mas aceite-o como um parâmetro:
Então, em seu MainActivity.kt, chame o controlador para TopBar() assim:
Isso deve resolver! Agora, MainActivity e TopBar() usam o mesmo controlador, então a navegação não trava mais.