es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Navega a otra pantalla sin el scaffold anterior en Jetpack Compose.

Mi aplicación tiene una pantalla principal con un Scaffold y una BottomNavigation bar:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        val navController = rememberNavController()
        MyApplicationTheme {
            Scaffold(
                bottomBar = {
                    BottomBar(navController = navController)
                }
            ) {
                NavigationGraph(navController = navController)
            }
        }
    }
}

@Composable
fun NavigationGraph(navController: NavHostController){
    NavHost(navController = navController, startDestination = BottomMenuOption.Home.route) {

        composable(route = BottomMenuOption.Home.route) {
            HomeScreen(navController = navController)
        }

        composable(route = BottomMenuOption.Settings.settings) {
            SettingsScreen()
        }
        composable(route = BottomMenuOption.Profile.route) {
            ProfileScreen()
        }

        composable(route = "feature") {
            FeatureScreen()
        }
    }
}

FeatureScreen tiene su propio Scaffold con una topBar en lugar de una bottomBar y cuando navego a él desde HomeScreen, quiero reemplazar el anterior de la pantalla principal y ver solo una topBar, pero en su lugar veo las dos barras en la pantalla.

@Composable
fun FeatureScreen() {
    Scaffold (
        topBar = {
            TopBar("Feature Screen")
        }
    )  {

    }
}

¿Es posible lograr esto? Estoy pensando que podría hacerse simplemente usando una nueva Activity, pero idealmente me gustaría mantener el enfoque de una sola Activity.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible lograr esto sin utilizar una nueva actividad.

    Una forma de lograr esto es utilizar la función replaceRoute en el NavController al navegar a la pantalla de características (FeatureScreen).

    Aquí tienes un ejemplo de cómo hacerlo:

    // En NavigationGraph composable
    composable(route = "feature") {
        // Usa replaceRoute en lugar de navigate para FeatureScreen
        navController.navigate("feature") {
            launchSingleTop = true
            // Reemplaza la ruta de HomeScreen con la ruta de FeatureScreen
            popUpTo(BottomMenuOption.Home.route) {
                inclusive = true
            }
        }
    }
    

    Con este código, al navegar a la pantalla de características (FeatureScreen), se reemplazará la ruta de la pantalla de inicio (HomeScreen) con la ruta de la pantalla de características (FeatureScreen), eliminando básicamente la pantalla de inicio y su barra inferior de la pila de navegación.

    Ahora, al navegar de regreso desde la pantalla de características (FeatureScreen), serás llevado directamente de vuelta a la pantalla de inicio (HomeScreen) sin ver la barra inferior de la pantalla principal.

    ¡Espero que esto te sea de ayuda!

Comments are closed.