# MultipleBackStackCompose **Repository Path**: ggbhack/multiple-back-stack-compose ## Basic Information - **Project Name**: MultipleBackStackCompose - **Description**: compose 学习分享 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-14 - **Last Updated**: 2023-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 主页面 ```kotlin MultipleBackstacksComposeTheme { //处理应用程序内的导航 val rootNavController = rememberNavController() // 这行代码从NavController中获取当前的返回栈条目,并创建一个状态,以便在返回栈发生变化时自动更新 val navBackStackEntry by rootNavController.currentBackStackEntryAsState() Scaffold( bottomBar = { NavigationBar { items.forEach { item -> // 这行代码通过将当前项的标题(转换为小写)与返回栈中当前目的地的路由进行比较来检查当前项是否被选中。如果它们匹配,则表示该项被选中。 val isSelected = item.title.lowercase() == navBackStackEntry?.destination?.route NavigationBarItem( selected = isSelected, onClick = { // 执行的导航操作 rootNavController.navigate(item.title.lowercase()) { /** * 这部分代码定义了导航时的返回栈行为。它指定了要弹出到的目标位置,即返回栈中的一个目的地。 * 在这里,rootNavController.graph.findStartDestination().id找到了导航图的起始目的地, * 并将其作为弹出目标。 */ popUpTo(rootNavController.graph.findStartDestination().id) { // 表示弹出到目标位置时,保存目标位置及其状态 saveState = true } // 如果导航目标已经在返回栈的栈顶,则不会创建一个新的实例,而是重用已存在的实例。 launchSingleTop = true /** * 这个参数指定了在导航到目标时是否应该恢复目标的状态。 * 如果目标之前已经被创建并保存了其状态,那么在导航到目标时会尝试恢复该状态。 * 这对于保持导航目标的状态一致性很有用。 */ restoreState = true } }, label = { Text(text = item.title) }, icon = { Icon( imageVector = if (isSelected) item.selectedIcon else item.unselectedIcon, contentDescription = item.title ) }) } } } ) { paddingValues -> Box(modifier = Modifier.padding(paddingValues)) { NavHost(navController = rootNavController, startDestination = "home"){ composable("home"){ HomeNavHost() } composable("chat"){ ChatNavHost() } composable("settings"){ SettingsNavHost() } } } } } ``` ## 构建host ```kotlin @Composable fun HomeNavHost() { val homeNavController = rememberNavController() NavHost(navController = homeNavController, startDestination = "home1"){ for (i in 1..10){ composable("home${i}"){ GenericScreen(text = "Home${i}") { if(i<10){ homeNavController.navigate("home${i+1}") } } } } } } ``` ## 生成页面 ```kotlin @Composable fun GenericScreen(text: String, onNextClick: () -> Unit) { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(text = text) Spacer(modifier = Modifier.height(16.dp)) Button(onClick = onNextClick) { Text(text = "Next") } } } ``` ## 底部导航栏数据 ```kotlin data class BottomNavigationItem( val title: String, val unselectedIcon: ImageVector, val selectedIcon: ImageVector ) val items = listOf( BottomNavigationItem( title = "Home", selectedIcon = Icons.Filled.Home, unselectedIcon = Icons.Outlined.Home ), BottomNavigationItem( title = "Chat", selectedIcon = Icons.Filled.Email, unselectedIcon = Icons.Outlined.Email ), BottomNavigationItem( title = "Settings", selectedIcon = Icons.Filled.Settings, unselectedIcon = Icons.Outlined.Settings ) ) ``` ## 底部导航栏的依赖 ```kts implementation("androidx.navigation:navigation-compose:2.7.5") ```