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

相关推荐
码龙-DragonCoding13 小时前
一键批量提取音频、提取视频
android·音视频·提取
祉猷并茂,雯华若锦13 小时前
Win下完美解决Allure报错,生成Web自动化测试报告
android·python·selenium·自动化
IT小盘15 小时前
08-FastAPI加MySQL实现AI对话记录持久化
android·mysql·fastapi
清泓y15 小时前
Android内存管理与性能优化面试真题
android·面试·性能优化
YF021116 小时前
Android compose详解
android
IT小码哥丶16 小时前
Android进阶之事件分发机制深度剖析
android
执明wa1 天前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder1 天前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农1 天前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户69371750013841 天前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端