Использование 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 возможных варианта:
- Вы можете создать BottomNavigationBar как пользовательский View/Composable и добавить его на каждый экран, на котором он должен быть, но вы должны обрабатывать всю навигацию вручную.
- У вас есть один BottomNavigationView в MainActivity (или основной компоновке), вы слушаете изменения и скрываете/показываете нижнюю панель для определенного экрана.