Jetpack Compose Navigation Explained

Jetpack Compose Navigation Explained

Android: Jetpack UI: Compose Level: Intermediate

🧭 What is Jetpack Compose Navigation?

Jetpack Compose Navigation is a component that provides a framework for implementing navigation between composable screens in a Jetpack Compose application. It allows developers to define routes, pass arguments between screens, and manage the navigation stack with a declarative API.

Why Use Compose Navigation? It provides a consistent way to handle navigation in Compose apps, with built-in support for deep linking, arguments passing, and animations.

🔧 Setting Up Dependencies

// Add to your app's build.gradle file dependencies { implementation "androidx.navigation:navigation-compose:2.5.3" }

📋 Key Components

Component Description
NavController Central API for navigation, handles navigating between destinations
NavHost Container that displays composables for the current route in the navigation graph
NavGraph Collection of destinations and the routes between them
composable() Function to define a composable destination with a specific route

💻 Basic Implementation

import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController @Composable fun Navigation() { val navController = rememberNavController() NavHost( navController = navController, startDestination = "home_screen" ) { composable("home_screen") { HomeScreen(navController) } composable("detail_screen") { DetailScreen(navController) } } }

🔄 Creating Screen Composables

Home Screen

@Composable fun HomeScreen(navController: NavController) { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text("Home Screen") Button(onClick = { navController.navigate("detail_screen") }) { Text("Go to Detail Screen") } } }

Detail Screen

@Composable fun DetailScreen(navController: NavController) { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text("Detail Screen") Button(onClick = { navController.popBackStack() }) { Text("Back to Home") } } }

📦 Passing Data Between Screens

1
Define Route with Parameters
composable("detail_screen/{itemId}") { backStackEntry -> val itemId = backStackEntry.arguments?.getString("itemId") DetailScreen(navController, itemId) }
2
Navigate with Arguments
val itemId = "123" Button(onClick = { navController.navigate("detail_screen/$itemId") }) { Text("Go to Detail with ID") }
3
Update Screen to Accept Parameters
@Composable fun DetailScreen(navController: NavController, itemId: String?) { Column(...) { Text("Detail Screen for item ID: $itemId") ... } }

🔙 Navigation Actions

  • navigate(route) - Navigate to a destination
  • popBackStack() - Navigate back to the previous destination
  • popBackStack(route, inclusive) - Pop back to a specific destination
  • navigateUp() - Navigate up in the app hierarchy

📝 Complete Example

Here's a complete example of a navigation setup with parameter passing:

@Composable fun MyApp() { Navigation() } @Composable fun Navigation() { val navController = rememberNavController() NavHost(navController = navController, startDestination = "home_screen") { composable("home_screen") { HomeScreen(navController) } composable("detail_screen/{itemId}") { backStackEntry -> DetailScreen( navController, itemId = backStackEntry.arguments?.getString("itemId") ) } } } @Composable fun HomeScreen(navController: NavController) { val itemId = "123" Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text("Home Screen") Button(onClick = { navController.navigate("detail_screen/$itemId") }) { Text("Go to Detail Screen") } } } @Composable fun DetailScreen(navController: NavController, itemId: String?) { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text("Detail Screen for item ID: $itemId") Button(onClick = { navController.popBackStack() }) { Text("Back to Home Screen") } } }

Build beautiful, navigable Compose apps.

Comments