Page cover image

Implementar la navegación

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

Y la pantalla de detalles podría ser

@Composable
fun LoginScreen(navController: NavController, loginScreenViewModel: LoginScreenViewModel = viewModel()) {
    val username by loginScreenViewModel.username.collectAsState()
    val password by loginScreenViewModel.password.collectAsState()
    Surface(
        modifier = Modifier
            .fillMaxSize()
            .statusBarsPadding()
    ) {
        Column(
            verticalArrangement = Arrangement.Center,
            modifier = Modifier.fillMaxSize()
        ) {
            TextField(
                modifier = Modifier.fillMaxWidth(),

                value = username,
                onValueChange = { loginScreenViewModel.setUsername(it) },
                placeholder = { Text("Username") }
            )
            Spacer(modifier = Modifier.height(16.dp))
            TextField(
                modifier = Modifier.fillMaxWidth(),
                value = password,
                onValueChange = { loginScreenViewModel.setPassword(it) },
                placeholder = { Text("Password") },
                visualTransformation = PasswordVisualTransformation()
            )
            Spacer(modifier = Modifier.height(16.dp))
            Row(modifier = Modifier.fillMaxWidth(),
                horizontalArrangement = Arrangement.Center) {
                Button(onClick = {
                    loginScreenViewModel.setUsername("")
                    loginScreenViewModel.setPassword("")
                }) {
                    Text("Limpiar")
                }
                Spacer(modifier = Modifier.width(16.dp))
                Button(onClick = {
                    navController.navigate(Screen.HomeScreen.route)
                }
                ) {
                    Text("Login")
                }
            }
        }
    }
}
3

Configura el grafo de navegación

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)
        }
    }
}
4

Carga el NavGraph en la actividad

Finalmente, llama a NavGraph desde MainActivity.

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.example.app.presentation.navigation.NavGraph

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApplicationTheme {
                NavGraph()
            }
        }
    }
}        

Última actualización

¿Te fue útil?