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 =

最低0.47元/天 解锁文章
2752

被折叠的 条评论
为什么被折叠?



