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导航的页面。

相关推荐
s***11704 小时前
Mysql convert函数、convert用法、字符串转数字、字符串转日期、类型转换函数
android·数据库·mysql
n***26565 小时前
【MySQL】MVCC详解, 图文并茂简单易懂
android·数据库·mysql
程序猿陌名!5 小时前
Android-EDLA RK3576谷歌ATTESTION-KEY从申请到烧录以及验证谷歌认证标志全流程
android
安卓理事人5 小时前
安卓版本升级功能
android
s***35305 小时前
怎么下载安装yarn
android·前端·后端
z***94845 小时前
使用rustDesk搭建私有远程桌面
android·前端·后端
q***06295 小时前
【细如狗】记录一次使用MySQL的Binlog进行数据回滚的完整流程
android·数据库·mysql
0***86335 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
9***44635 小时前
SQLyog安装配置(注册码)连接MySQL
android·mysql·adb
o***11145 小时前
【MySQL】MySQL库的操作
android·数据库·mysql