Compose Navigation总结

1.Navigation

Compose本身缺乏类似Fragment的页面导航功能,而Navigation库为此提供了关键支持。
它既像一个粘合剂,将高内聚的页面以低耦合的方式组织起来;又像一个管家,负责管理导航页面的状态和对应的回退栈。

2.回退栈

  • Navigation组件内部维护一个目的地堆栈,堆栈的底部为起始目的地,导航到一个新的目的地时会将该目的地推送到堆栈的顶部,这样便形成了一个回退栈。
  • 回退栈里的元素类型是NavBackStackEntry,它不仅存储导航中携带的参数,也是代表了这个目的地的生命周期状态。
  • 页面导航的过程中,提供了操作栈内元素的方法,比如哪些元素出栈之后,再压入新的元素到栈顶。这有点类似于Activity的任务栈。
  • 当点击系统自带的NavigationBar的返回按钮时,堆栈里的目的地就会依次弹出,最后会显示初始目的地,再次点击返回按钮时,退出应用。

3.Navigation组件

Navigation主要包含以下几个组件:

3.1 宿主 NavHost

包含导航目的地的界面元素,当用户浏览应用时,会在导航宿主中切换目的地。
NavHost在构建的时候,会构建出NavGraph

3.2 导航图 NavGraph

一种数据和行为的关系图,定义应用中的所有导航目的地以及它们如何连接在一起,是导航的蓝图。

3.3 控制器 NavController

管理目的地之间导航的状态、处理深层链接、管理返回栈等。

3.4 目的地 NavDestination

导航图中的节点数据,代表应用中一个内容屏幕,当用户导航到此节点时,会显示此目的地的内容。

3.5 路线 route

任何可序列化的数据类型,唯一标识目的地及其所需的任何数据。使用路线导航,并前往目的地。

4. 使用Navigation

4.1 创建导航控制器 NavController

在使用 Jetpack Compose 时创建 NavController,请调用 rememberNavController()

val navController = rememberNavController()

一般是在顶级的Composable函数中创建NavController,这样所有组件才能引用它。

4.2 创建导航图 NavGraph

在Compose中,使用NavHost可组合项,在构建NavHost的过程中,就直接构建了导航图,这是推荐的方式。
说白了,就是在NavHost的lambda表达式里,直接定义每个页面的标签,以及对应的跳转逻辑,如下:

NavHost(navController = navController, "ChatList") {
   
   
        composable (route = "ChatList"){
   
   
            ChatListPage {
   
   
                navController.navigate("ChatDetail")
            }
        }
        composable(route = "ChatDetail") {
   
   
            ChatDetailPage()
        }
    }

通过compoasable函数去定义了两个页面,一个是聊天列表页ChatListPage(),一个是具体某个人的聊天详情页ChatDetailPage()。在ChatListPage后面跟了一个Lambda表达式,在ChatListPage内部的列表item点击的时候,会调用这个lambda表达式,并导航到ChatDetailPage页面。

route参数就是这个页面唯一的标识,也叫做路线,使用可序列化对象或者类定义路线。我这里使用的是字符串(可序列化)作为路线,优点是实现简单,但不太利于传参。

我们做一下修改,使用可序列化的 类和对象定义路线:

@Serializable
object ChatListRoute

@Serializable
data class ChatDetailRoute(val name : String)  //这里定义一个参数,在导航跳转的时候传递

这里要注意,实现序列化需要引入Kotlin序列化插件(Kotlin serialization plugin),以及json序列化库依赖(JSON serialization library),如下:

[versions]
kotlin = "2.2.10"
navigation = 
### Jetpack Compose 导航的使用方法 Jetpack Compose 提供了一种现代化的方式来构建用户界面,而 `Navigation` 是其中用于管理屏幕之间导航的核心组件之一。以下是关于如何实现和解决常见问题的一些详细说明。 #### 1. 基本概念 Compose导航库允许开发者通过声明式的 API 来定义应用中的不同目的地以及它们之间的转换逻辑。核心类包括 `NavHost`, `NavController`, 和 `composable()` 函数[^2]。 - **NavHost**: 它是一个容器,负责承载所有的可组合函数作为目标页面。 - **NavController**: 控制器对象,用来触发导航动作并维护返回栈的状态。 - **Composable Functions (Destination)**: 表示各个独立视图或者片段的功能单元。 #### 2. 设置环境 要开始使用 Navigation,请先添加依赖项到项目的 build.gradle 文件中: ```gradle dependencies { implementation "androidx.navigation:navigation-compose:2.7.0" } ``` 此版本号应替换为你当前项目支持的最新稳定版[^3]。 #### 3. 创建简单的导航结构 下面展示了一个基本的例子来演示如何设置两个屏幕间的切换操作: ```kotlin import androidx.compose.runtime.Composable import androidx.navigation.NavType import androidx.navigation.navArgument import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController @Composable fun AppNavigation() { val navController = rememberNavController() NavHost(navController = navController, startDestination = "home") { composable("home") { HomeScreen(navController) } composable( route = "details/{itemId}", arguments = listOf(navArgument("itemId") { type = NavType.IntType }) ) { backStackEntry -> DetailsScreen(itemId = backStackEntry.arguments?.getInt("itemId")) } } } @Composable fun HomeScreen(navController: NavController) { Button(onClick = { navController.navigate("details/42") }) { Text(text = "Go to Detail Screen") } } @Composable fun DetailsScreen(itemId: Int?) { Column { Text(text = "Item ID is $itemId") } } ``` 上述代码展示了从主页跳转至详情页的过程,并传递参数给后者处理[^4]。 #### 4. 处理深链接 除了常规内部路由外,还可以配置外部 URL 映射以便直接打开特定位置的内容。例如: ```kotlin navGraphBuilder.deepLink { uriPattern = "https://example.com/details/{id}" } ``` 这样当访问指定 URI 格式时会自动映射对应的目标节点[^5]。 #### 5. 解决可能遇到的问题 如果发现某些功能无法正常工作,则可以尝试以下几个方面排查原因: - 确认所使用的 compose 版本是最新的; - 检查是否有遗漏必要的初始化步骤; - 对于复杂状态共享场景考虑引入 ViewModel 或其他数据管理层级设计模式优化交互流程;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值