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

相关推荐
jyan_敬言1 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
程序员老刘1 小时前
Android 16开发者全解读
android·flutter·客户端
福柯柯2 小时前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩2 小时前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子2 小时前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖2 小时前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera
用户2018792831672 小时前
🌟 童话:四大Context徽章诞生记
android
yzpyzp3 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
aningxiaoxixi3 小时前
安卓之service
android
TeleostNaCl4 小时前
Android 应用开发 | 一种限制拷贝速率解决因 IO 过高导致系统卡顿的方法
android·经验分享