Jetpack Compose Navigation 3: Transitioning to NavDisplay

Learn how to enhance navigation in Jetpack Compose using NavDisplay instead of NavController in this comprehensive tutorial.

Jetpack Compose has transformed how we build UIs in Android, making it more intuitive and reactive. One of the key features in building complex applications is navigation. Traditionally, developers have relied on NavController for navigation in Jetpack Compose. However, in this tutorial, we will explore a new approach using NavDisplay, a more streamlined and efficient alternative for managing navigation. Understanding NavDisplay NavDisplay is a new component introduced in Jetpack Compose Navigation 3 that simplifies navigation management by offering a more declarative approach. With NavDisplay, you can easily define your navigation structure in a way that is more aligned with the Compose paradigm. Setting Up Your Project To get started, ensure that your project is set up with Jetpack Compose and the necessary dependencies. In your build.gradle file, add the following dependencies: groovy dependencies { implementation "androidx.navigation:navigation-compose:3.0.0" // Other dependencies } Make sure to sync your project after adding these dependencies. Creating NavDisplay To utilize NavDisplay, you first need to create a navigation graph. This graph defines the destinations (composable functions) and how they relate to each other. Here’s how you can set it up: kotlin import androidx.compose.runtime.Composable import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable fun NavGraphBuilder.myNavGraph() { composable("home") { HomeScreen() } composable("detail/{itemId}") { backStackEntry - DetailScreen(itemId = backStackEntry.arguments?.getString("itemId")) } } In this snippet, we define two destinations: HomeScreen and DetailScreen. The DetailScreen takes an argument itemId, which can be passed during navigation. Using NavDisplay Once you have defined your navigation graph, you can use NavDisplay to manage the navigation within your Compose app. Here’s an example of how to set it up in your main activity: kotlin import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.runtime.Composable import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController @Composable fun MyApp() { val navController = rememberNavController() Surface(color = MaterialTheme.colors.background) { NavHost(navController = navController, startDestination = "home") { myNavGraph() } } } In this code, we create a NavHost that uses the navController and the startDestination. The myNavGraph() function is then called to include the defined destinations. Navigating Between Screens To navigate between screens, you use the navController to navigate to the desired destination. Here’s how you can implement a button in HomeScreen that navigates to DetailScreen: kotlin import androidx.compose.material.Button import androidx.compose.material.Text @Composable fun HomeScreen(navController: NavController) { Button(onClick = { navController.navigate("detail/1") // Pass itemId as 1 }) { Text("Go to Detail Screen") } } This button, when clicked, triggers the navigation to the DetailScreen while passing an itemId of 1. Handling Back Navigation Handling back navigation is essential for a good user experience. NavDisplay makes this straightforward by managing the back stack for you. When the user presses the back button, the app automatically returns to the previous screen without additional code. Conclusion By transitioning from NavController to NavDisplay, developers can benefit from a more declarative and streamlined navigation approach in Jetpack Compose. This tutorial has provided a foundational understanding of how to implement NavDisplay, creating a more efficient navigation structure for your Compose applications. For a more in-depth look at this process, including real-time coding examples, check out the full tutorial here: Watch the full tutorial on YouTube(https://www.youtube.com/watch?v=MW4Xb9p2jVg).