Jetpack compose嵌套导航

准确的说是一个stack导航里嵌套了一个tab导航。这个时候按照文档的方法会报错。所以需要用到两个NavHost来处理。代码在这里。APP的导航是这样的:

点了首页的todo item后跳转到todo的详情页,这个时候整个的tab都不可见。

先看tab navigator。这是是一个底部的tab。代码如下:

kotlin 复制代码
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TabScreen(outerNav: NavHostController) {
    val navController = rememberNavController()
    val tabBarItems = listOf(
        Screens.Home,
        Screens.Settings,
    )
    val navBackStackEntry by navController.currentBackStackEntryAsState()

    Scaffold(topBar = {
        TopAppBar(
            // removed
        )
    }, bottomBar = {
        BottomTabBar(navController = navController, items = tabBarItems)
    }) { innerPadding ->
        NavHost(
            navController = navController,
            startDestination = Screens.Home.route,
            Modifier.padding(innerPadding)
        ) {
            composable(Screens.Home.route) {
                HomeScreen(
                    outerNav = outerNav,
                    navController = navController
                )
            }
            composable(Screens.Settings.route) {
                SettingsScreen(
                    navController = navController,
                )
            }
            composable(
                route = Screens.AddTodo.route, // TODO: enter & exit transition?
            ) { AddTodoScreen(navController = navController) }
        }
    }
}

删掉了一些不必要的代码,但是不影响阅读。

TabScreen接收一个参数outerNav,这个参数随后会传入Tab导航的第一个screen也就是HomeScreen。这样在首页点击一个todo条目的时候就可以使用外部的导航来跳转页面。

现在看看外面的导航,其实很简单:

kotlin 复制代码
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainScreen(settingsViewModel: SettingsViewModel = hiltViewModel()) {
    val navController = rememberNavController()

    NavHost(navController = navController, startDestination = "main") {
        composable(route = "main") {
            TabScreen(outerNav = navController)
        }

        composable(route = "${Screens.Detail.route}/{todoId}") { backStackEntry ->
            DetailScreen(
                navController = navController,
                backStackEntry.arguments?.getString("todoId")?.toIntOrNull()
            )
        }
    }
}

在tab导航使用的外部导航outerNav就是在这里创建的,然后传给了TabScreen

总结一下,外部的stack导航的navigator传给嵌套的tab导航,然后再传递给tab导航的首页。并在首页里使用外部的导航跳转stack导航的页面。

相关推荐
婵鸣空啼4 小时前
GD图像处理与SESSiON
android
sunly_5 小时前
Flutter:导航固定背景图,滚动时导航颜色渐变
android·javascript·flutter
ljt27249606615 小时前
Compose笔记(二十六)--DatePicker
笔记·android jetpack
用户2018792831675 小时前
简单了解android.permission.MEDIA_CONTENT_CONTROL权限
android
_一条咸鱼_5 小时前
Android Runtime类卸载条件与资源回收策略(29)
android·面试·android jetpack
顾林海5 小时前
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
android·面试·性能优化
砖厂小工5 小时前
Now In Android 精讲 8 - Gradle build-logic 现代构建逻辑组织方式
android
玲小珑6 小时前
Auto.js 入门指南(八)高级控件与 UI 自动化
android·前端
harry235day6 小时前
Compose 带动画的待办清单列表页
android·android jetpack
vocal6 小时前
我的安卓第一课:四大组件之一Activity及其组件RecyclerView
android