Para poder definir la navegación en nuestra aplicación vamos a seguir los siguientes pasos
1
Definición las rutas de navegación
Crea una sealed class en presentation.navigation.Screen.kt para centralizar las rutas.
// Dentro de la sealed class definimos un object por cada ruta existenten
sealed class Screen(val route: String) {
// Definimos la pantalla Home en la ruta home
data object Home : Screen("home")
// Definimos la pantalla Login en la ruta login
data object Login : Screen("login")
}
2
Inyecta el NavController en las pantallas
Las pantallas que vayan a realizar navegación deben añadir un parámetro NavController que les permita navegar
Por ejemplo, la HomeScreen podría ser
import androidx.compose.runtime.Composable
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
@Composable
fun HomeScreen(navController: NavController) {
Column(
verticalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Text(
text = "Home Screen",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(16.dp))
Button(
// Al pulsar en el botón abre la ventana de Detalles con el parámetro 123
onClick = { navController.navigate(Screen.Login.route) }
) {
Text("Logout")
}
}
}
Crea una función presentation.navigation.NavGraph que registre las rutas y establezca una pantalla inicial. Para registrar las rutas utilizaremos el objeto NavHost
import androidx.compose.runtime.Composable
import androidx.navigation.NavHost
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
// El startDestination define la pantalla que se cargará cuando se abre la aplicación
@Composable
fun NavGraph(startDestination: String = Screen.Home.route) {
// Cargamos el navController
val navController = rememberNavController()
// Creamos un NavHost que arranque con la pantalla de inicio
NavHost(navController = navController, startDestination = startDestination) {
// Definimos que para la ruta Screen.Home.route se cargue el composable HomeScreen(navController)
composable(Screen.Home.route) {
HomeScreen(navController)
}
// Definimos que para la ruta Screen.Login.route se cargue el composable LoginScreen(navController)
composable(Screen.Login.route) {
LoginScreen(navController)
}
}
}