当前位置: 首页 > article >正文

Compose中导航跳转的实现NavHost

文章目录

  • 1、添加依赖
  • 2、两个页面导航跳转的实现
    • 2.1 定义导航图
    • 2.2 创建导航控制器
    • 2.3 实现两个页面跳转
  • 2、带参数的导航
    • 2.1 定义带参数的路径
    • 2.2 定义接收参数
    • 2.3 导航到带参数的屏幕
  • 3、关键点

1、添加依赖

// build.gradle
dependencies {implementation "androidx.navigation:navigation-compose:2.7.7" // 使用最新版本implementation "com.google.accompanist:accompanist-navigation-animation:0.32.0" // 动画扩展
}

2、两个页面导航跳转的实现

自定义两个页面,分别是HomeScreen() 和 DetailScreen(), 设置初始页面为HomeScreen(),从页面HomeScreen()中跳转到HomeScreen(),先介绍无参数的跳转。

2.1 定义导航图

使用密封类定义路由常量,保证一个常量,防止写错的情况。

// 定义路由常量(推荐使用密封类)
sealed class Screen(val route: String) {data object Home : Screen("home")data object Detail : Screen("detail")
}

2.2 创建导航控制器

设置导航控制器,将HomeScree作为首页

@Composable
fun AppNavigation() {val navController = rememberNavController()NavHost(navController = navController,startDestination = Screen.Home.route,// 添加共享元素动画enterTransition = { slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left) },exitTransition = { slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Right) }) {composable(Screen.Home.route) { //自定义页面HomeScreen(navController) }composable(Screen.Detail.route) { //自定义页面DetailScreen(navController)}}
}

2.3 实现两个页面跳转

第一个Home页面显示:

AppNavigation()

跳转到第二个Detail页面中:

navController.navigate(Screen.Detail.route)

2、带参数的导航

2.1 定义带参数的路径

创建一个生成实际路由的方法,替换占位符

sealed class Screen {data  object Detail : Screen("detail/{id}") {// 创建一个实际路由的方法,替换占位符fun createRoute(id: String) = "detail/$id"}
}

2.2 定义接收参数

在 NavHost 中定义可组合的屏幕,包括带参数的屏幕

 // 详情屏幕(带参数)composable(route = Screen.Detail.route,arguments = listOf(navArgument("id") { type = NavType.StringType // 可选:设置参数是否可为空,默认值等})) { entry ->// 从参数中获取idval id = entry.arguments?.getString("id") ?: "" // 提供默认值防止空DetailScreen(id, navController)}

2.3 导航到带参数的屏幕

使用 createRoute 方法生成实际的路由字符串。

navController.navigate(Screen.Detail.createRoute("123"))

3、关键点

NavHost组件

val navController = rememberNavController()NavHost(navController, startDestination = "home") {composable("home") { HomeScreen() }}
http://www.lryc.cn/news/2393239.html

相关文章:

  • VSCode/Cursor中Red Hat Dependency Analytics扩展的自动依赖注入files:分析
  • 【技能篇】RabbitMQ消息中间件面试专题
  • Linux研学-环境搭建
  • Ubuntu系统下可执行文件在桌面单击运行教程
  • Linux之文件进程间通信信号
  • shell脚本打包成可以在麒麟桌面操作系统上使用的deb包
  • 代码随想录算法训练营 Day61 图论ⅩⅠ Floyd A※ 最短路径算法
  • 【Python】yield from 功能解析
  • 私有云大数据部署:从开发到生产(Docker、K8s、HDFS/Flink on K8s)
  • 改写自己的浏览器插件工具 myChromeTools
  • python-pptx去除形状默认的阴影
  • kuboard自带ETCD存储满了处理方案
  • SpringBoot+tabula+pdfbox解析pdf中的段落和表格数据
  • 外包项目交付后还能怎么加固?我用 Ipa Guard 给 iOS IPA 增加了一层保障
  • GitHub push失败解决办法-fatal: unable to access ‘https://github.com/xxx
  • USB MSC SCCI
  • 解决Acrobat印前检查功能提示无法为用户配置文件问题
  • 华为OD最新机试真题-反转每对括号间的子串-OD统一考试(B卷)
  • 电商平台 API、数据抓取与爬虫技术的区别及优势分析
  • 领域驱动设计 (Domain-Driven Design, DDD)
  • 单卡4090部署Qwen3-32B-AWQ(4bit量化)-vllm
  • 漫画Android:Handler机制是怎么实现的?
  • 多部手机连接同一wifi的ip一样吗?如何更改ip
  • 飞牛fnNAS的Docker应用之迅雷篇
  • C++中指针与引用的区别详解:从原理到实战
  • SQLMesh 用户定义变量详解:从全局到局部的全方位配置指南
  • inviteflood:基于 UDP 的 SIP/SDP 洪水攻击工具!全参数详细教程!Kali Linux教程!
  • 软件工程:关于招标合同履行阶段变更的法律分析
  • mysql一主多从 k8s部署实际案例
  • Visual Studio 2022 设置自动换行