Android Compose NavHost

在 Compose 层次结构中的导航函数,相当于xml >> Navigation组件。

implementation 'androidx.navigation:navigation-compose:2.4.1'

别导错了导成 androidx.navigation:navigation-runtime-ktx:x.x.x,因为它也有 NavHost 而且 Android Studio 优先导这个

sealed class Screen(val route: String) {
    object Profile : Screen("profile")
    object Dashboard : Screen("dashboard")
    object Scrollable : Screen("scrollable")
    object Dialog : Screen("dialog/{title}") {
        fun createRoute(title: String) = "dialog/$title"
    }
}
@Composable
private fun AppView() {
    val  navController: NavHostController =  rememberNavController()
    Scaffold { innerPadding ->
        NavHost(navController, Screen.Profile.route, Modifier.padding(innerPadding)) {
            composable(Screen.Profile.route) { backStackEntry -> ProfileView(navController,backStackEntry) }
            composable(Screen.Dashboard.route) { backStackEntry -> DashboardView(navController,backStackEntry) }
            composable(Screen.Scrollable.route) { backStackEntry -> ScrollableView(navController,backStackEntry) }
            dialog(Screen.Dialog.route) { backStackEntry -> DialogContent(navController,backStackEntry) }
        }
    }
}

@Composable
fun ScrollableView(navController: NavHostController,backStackEntry: NavBackStackEntry) {
    Column(Modifier.fillMaxSize()) {
        OutlinedButton(onClick = {
            //防止重复调用
            if(backStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED) navController.navigate(Screen.Dialog.createRoute(Uri.encode("这是另一个提示")))
        }) {
            Text(text = "这是另一个提示")
        }
        OutlinedButton(onClick = {
            navController.popBackStack()
        }, Modifier.align(Alignment.CenterHorizontally)) {
            Text(text = "to Back")
        }
    }
}

@Composable
fun DashboardView(navController: NavHostController,backStackEntry: NavBackStackEntry) {
    Column(Modifier.fillMaxSize()) {
        OutlinedButton(onClick = {
            //防止重复调用
            if(backStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED) navController.navigate(Screen.Dialog.createRoute(Uri.encode("这是一个提示")))
        }) {
            Text(text = "这是一个提示")
        }
        OutlinedButton(onClick = {
            navController.popBackStack()
        }, Modifier.align(Alignment.CenterHorizontally)) {
            Text(text = "to Back")
        }
    }
}

@Composable
fun ProfileView(navController: NavHostController,backStackEntry: NavBackStackEntry) {
    Column(Modifier.fillMaxSize()) {
        OutlinedButton(onClick = {
            //防止重复调用
            if(backStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED) navController.navigate(Screen.Dialog.createRoute(Uri.encode("这是一个警告")))
        }, Modifier.align(Alignment.CenterHorizontally)) {
            Text(text = "这是一个警告")
        }
        OutlinedButton(onClick = {
            //防止重复调用
            if(backStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED) navController.navigate(Screen.Dashboard.route)
        }, Modifier.align(Alignment.CenterHorizontally)) {
            Text(text = "to DashboardView")
        }
        OutlinedButton(onClick = {
            //防止重复调用
            if(backStackEntry.lifecycle.currentState == Lifecycle.State.RESUMED) navController.navigate(Screen.Scrollable.route)
        }, Modifier.align(Alignment.CenterHorizontally)) {
            Text(text = "to ScrollableView")
        }
    }
}

@Composable
fun DialogContent(navController: NavHostController,backStackEntry: NavBackStackEntry) {
    AlertDialog(
        onDismissRequest = {},
        title = { Text(text = backStackEntry.arguments?.getString("title","")?: "")},
        confirmButton = {
            TextButton(onClick = {
                navController.popBackStack()
            }) {
                Icon(Icons.Filled.Done, contentDescription = null )
            }
        }
    )
}
fun NavHost(
    navController: NavHostController!,//NavHostController实例
    startDestination: String!,//默认显示堆栈
    modifier: Modifier! = Modifier,
    route: String? = null,
    builder: (@ExtensionFunctionType NavGraphBuilder.() -> Unit)?
): Unit

判断backStackEntry是否在RESUMED(前台)防止重复调用.

navController.popBackStack() 返回上一堆栈

navController.navigate(XXX) 跳转到指定堆栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值