Problema de la barra de navegación inferior de Android Jetpack Compose.
A continuación se muestra una descripción general de la implementación de BottomNav. La aplicación muestra correctamente la barra de navegación inferior, pero cuando se selecciona un elemento, llama al NavHost varias veces. Veo un problema similar para las muestras de Jetpack Compose en https://github.com/android/compose-samples/tree/main/Jetsnack. ¿Hay alguna solución alternativa para evitar las múltiples llamadas a NavHost?
@Composable
fun MainScreen() {
val navController = rememberNavController()
Scaffold(
bottomBar = { BottomMenu(navController = navController) }
) {
BottomNavGraphBar(navController = navController)
}
}
// manejando el evento de clic
BottomNavigationItem(
onClick = {
navController.navigate(screen.route) {
popUpTo(navController.graph.findStartDestination().id)
launchSingleTop = true
}
}
)
// implementación de NavHost
@Composable
fun BottomNavGraphBar(navController: NavHostController) {
NavHost(
navController = navController,
startDestination = Screen.Home.route
) {
composable(route = Screen.Home.route) {
Log.d("BottomNavGraph","BottomNavGraph->HomeScreen")
HomeScreen()
}
composable(route = Screen.Settings.route) {
Log.d("BottomNavGraph","BottomNavGraph->AppSettingsScreen")
AppSettingsScreen()
}
composable(route = Screen.Profile.route) {
Log.d("BottomNavGraph","BottomNavGraph->ProfileScreen")
ProfileScreen()
}
}
}
<!---LogCat--->
// Cuando se inicia la aplicación
BottomNavGraph->HomeScreen
BottomNavGraph->HomeScreen
// Se hace clic en el perfil.
BottomNavGraph->HomeScreen
BottomNavGraph->ProfileScreen
BottomNavGraph->HomeScreen
BottomNavGraph->ProfileScreen
davy.ai
El problema de que NavHost se llame varias veces cuando se selecciona un elemento en BottomNav puede resolverse utilizando la función
rememberSaveable
para recordar la pestaña seleccionada y su estado. Esto asegura que el estado de la pestaña se mantenga y se evite llamar innecesariamente a NavHost. Además, también se puede utilizarensureBackStackEntry
para agregar la pestaña seleccionada a la pila de retroceso para poder realizar una navegación hacia arriba.Aquí hay un ejemplo de implementación:
Con esta implementación, la pestaña seleccionada se recuerda y no se llama innecesariamente a NavHost varias veces. Además, la función
ensureBackStackEntry
garantiza que la pestaña seleccionada se agregue a la pila de retroceso y admita la navegación hacia arriba.