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

Jetpack Compose 导航 (Navigation)

Jetpack Compose 提供了现代化的导航解决方案,与传统的 Fragment 导航不同,它完全基于 Composable 函数构建。以下是 Compose 导航的核心用法:

1. 基本设置

首先添加依赖:

implementation "androidx.navigation:navigation-compose:2.7.7"  // 使用最新版本

2. 创建 NavController

val navController = rememberNavController()// 在 Scaffold 或根布局中使用
ComposeAppTheme {NavHost(navController = navController, startDestination = "home") {// 定义各个屏幕}
}

3. 定义导航图 (NavGraph)

NavHost(navController = navController,startDestination = "main_screen"
) {composable("main_screen") { MainScreen(navController) }composable("detail_screen/{itemId}") { backStackEntry ->val itemId = backStackEntry.arguments?.getString("itemId")DetailScreen(itemId, navController)}dialog("settings_dialog") { SettingsDialog(navController) }
}

4. 导航操作

跳转到新页面

// 基本导航
navController.navigate("detail_screen")// 带参数导航
navController.navigate("detail_screen/123")// 带对象参数 (需要自定义 NavType)
navController.currentBackStackEntry?.arguments?.apply {putParcelable("key", myObject)
}
navController.navigate("detail_screen")

返回操作

// 简单返回
navController.popBackStack()// 返回并传递结果
navController.previousBackStackEntry?.savedStateHandle?.set("result_key", resultData
)
navController.popBackStack()// 返回根页面
navController.popBackStack(route = "main_screen",inclusive = false
)

5. 高级功能

深层链接

composable("detail_screen/{id}",deepLinks = listOf(navDeepLink { uriPattern = "example.com/detail/{id}"})
)

底部导航栏集成

val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destinationBottomNavigation {items.forEach { screen ->BottomNavigationItem(selected = currentDestination?.route == screen.route,onClick = {navController.navigate(screen.route) {popUpTo(navController.graph.findStartDestination().id) {saveState = true}launchSingleTop = truerestoreState = true}})}
}

动画过渡

composable("screen1",enterTransition = { slideIntoContainer(AnimatedContentTransitionScope.SlideDirection.Left) },exitTransition = { slideOutOfContainer(AnimatedContentTransitionScope.SlideDirection.Left) }
)

6. 最佳实践

  1. 1、使用密封类管理路由

  2. sealed class Screen(val route: String) {object Home : Screen("home")object Detail : Screen("detail/{id}") {fun createRoute(id: String) = "detail/$id"}
    }

  1. 2、避免直接传递复杂对象,使用ID然后在目标屏幕获取数据

  1. 3、处理返回按钮

BackHandler(enabled = true) {if (!navController.popBackStack()) {// 处理无法返回的情况}
}
  1. ViewModel共享:使用hiltViewModel()在导航目标间共享ViewModel

Compose导航相比传统导航更简洁,所有界面都是Composable函数,没有Fragment的生命周期复杂性,使得导航逻辑更加直观和易于维护。

http://www.xdnf.cn/news/8892.html

相关文章:

  • mysql 导入导出数据
  • Cache写策略
  • 【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则
  • Unity3D 彩色打印
  • 【基础工程搭建】Load Bus Error异常问题分析
  • 双深度Q网络(Double DQN)基础解析与python实例:训练稳定倒立摆
  • 2021年认证杯SPSSPRO杯数学建模A题(第二阶段)医学图像的配准全过程文档及程序
  • SpringCloud实战:Seata分布式事务整合指南
  • 模型实战(28)之 yolov5分类模型 训练自己的数据集
  • LeetCode 1040.移动石子直到连续II
  • PowerDesigner 安装+汉化+破解
  • RAG赋能图像知识库,让AI读懂每一帧画面
  • 分布式缓存:CAP 理论在实践中的误区与思考
  • PP-OCRv5
  • Python类属性与实例属性的覆盖机制:从Vector2d案例看灵活设计
  • linux学习第15天(dup和dup2)
  • 基于大模型预测亚急性脊髓联合变性的综合技术方案研究报告大纲
  • Gitlab 的 WIP 不生效了?
  • windows和mac安装虚拟机-详细教程
  • 基于Android的军训app的设计与实现
  • vue+js 创造动态的光晕圈
  • 【风控】什么是风控策略?
  • 基于ssm+mysql的实习支教中小学学校信息管理系统(含LW+PPT+源码+系统演示视频+安装说明)
  • ae卡通打架烟雾特效
  • [创业之路-381]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观-经济-如何获得国家经济政策与愿景规划,以及技术发展趋势、技术成熟度
  • 性能优化关键:link、script和meta的正确打开方式
  • day 36
  • SOC-ESP32S3部分:12-2、编码器驱动
  • 使用JSP踩过的坑
  • 《算法笔记》12.2小节——字符串专题->KMP算法 问题 C: 剪花布条