Использование NavController и BottomNavigation в одном приложении

Я разрабатываю приложение, которое имеет начальный экран-заставку, а затем переходит на страницу домашнего экрана с нижней навигацией с двумя вкладками: «Домой» и «О программе». Когда пользователь нажимает на одну карточку на домашней странице, приложение должно перейти к сведениям об этой карточке, где нижняя навигация больше не нужна, а когда нажимает на вкладку «О программе», переходит к «О программе», а нижняя навигация по-прежнему отображается. На домашней странице все показано составными элементами. Я сделал это с помощью navhostcontrollers, и он работает правильно, но правильный ли это подход или есть лучшие способы решения такой проблемы?

Я объяснил, что я пытался

это моя основная деятельность

          ScreenNavGraph(navController = rememberNavController()) 

который вызывает

          @Composable
    fun ScreenNavGraph(
        navController: NavHostController
    ) {
    NavHost(navController = navController, startDestination = 
    MainScreens.Splash.route) {
    //Default navigation to splash screen
    composable(route = MainScreens.Splash.route) {
        SplashScreen(navController)
    }
    //Navigate to a HomeScreen loader
    composable(route = MainScreens.Home.route){
        HousifyRootScreen(screenNavController = navController)
    }
    //Navigate to screen of each homes details
    composable(route = MainScreens.Details.route){
        HousifyDetailsScreen()
    }
}

}

а затем после заставки он переходит к

      HousifyRootScreen(screenNavController = navController) where I have:

@Composable
fun HousifyRootScreen(bottomBarNavController: NavHostController = 
rememberNavController(), screenNavController: NavController) {
Scaffold(
    bottomBar = {  BottomBar(navController = bottomBarNavController) }
) {
    val housifyViewModel: HousifyViewModel = viewModel()
    HomeNavGraph(navController = bottomBarNavController,
        screenNavController = screenNavController,
        housifyUiState = housifyViewModel.housifyUiState)
}

}

а HomeNavGraph — это главная страница, которая загружается после Splash

      @Composable
fun HomeNavGraph(
    navController: NavHostController,screenNavController: 
    NavController,housifyUiState: HousifyUiState
) {
    var isSearchPage by remember { mutableStateOf(false)}
    when(housifyUiState) {
        is HousifyUiState.Success -> 
        HousifyHomeScreenContent(housifyUiState = housifyUiState.houses,
        onButtonClick = 
           {screenNavController.navigate(MainScreens.Details.route) },
           onSearchClick = {isSearchPage = true})

}

NavHost(
    navController = navController,
    startDestination = BottomBarScreen.Home.route
) {
    composable(route = BottomBarScreen.Home.route) {
        if (isSearchPage) {
            HousifySearchScreen { isSearchPage = false }

        }
    }

    composable(route = BottomBarScreen.About.route) {
        HousifyAboutScreen()
    }
}

}

1 ответ

Я думаю, что у вас есть 2 возможных варианта:

  1. Вы можете создать BottomNavigationBar как пользовательский View/Composable и добавить его на каждый экран, на котором он должен быть, но вы должны обрабатывать всю навигацию вручную.
  2. У вас есть один BottomNavigationView в MainActivity (или основной компоновке), вы слушаете изменения и скрываете/показываете нижнюю панель для определенного экрана.
Другие вопросы по тегам