compose导航简单使用讲解

简介: compose导航简单使用讲解

概览



所谓的导航就是页面跳转,因为Compose中每一个@Composable注解标注的方法就可以成为一个视图,所以导航就是用来处理这些视图之间的跳转操作。


配置


  1. 配置我们的根gradle中kotlin插件版本
classpath "com.android.tools.build:gradle:7.1.0-alpha03"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10"
复制代码
  1. 加入导航依赖
implementation("androidx.navigation:navigation-compose:2.4.0-alpha02")
复制代码
  1. 根gradle配置compose version
compose_version = '1.0.0-beta09'
复制代码


基础用法


使用导航首先需要构建一个导航图,将每个导航视图分别与一个字符串相关联,本例中我们模拟这样一个场景,点击商品列表跳转到商品详情页面

  1. 构建导航图

导航图中我们构建了两个路由,goodsList代表商品列表,goodsDetail代表商品详情。

@Composable
fun Greeting(name: String) {
    val controller = rememberNavController()
    NavHost(navController = controller, startDestination = "goodsList") {
        composable("goodsList") {
            GoodsList(controller)
        }
        composable("goodsDetail") {
            GoodsDetail()
        }
    }
}
复制代码
  1. 商品列表
@Composable
fun GoodsList(controller: NavHostController) {
    Column {
        (1..9).forEach {
            GoodsItem(controller, it)
        }
    }
}
复制代码

商品item

点击商品item使用路由跳转到商品详情

@Composable
fun GoodsItem(controller: NavHostController, i: Int) {
    Column {
        Row(modifier = Modifier.clickable {
            controller.navigate("goodsDetail")
        }, verticalAlignment = Alignment.CenterVertically) {
            Image(painter = painterResource(id = R.drawable.apple), contentDescription = "")
            Text(text = "第件${i}件商品", modifier = Modifier.padding(start = 8.dp))
            Spacer(modifier = Modifier.weight(1f))
        }
        Divider(color = Color.Red)
    }
}
复制代码
  1. 商品详情
@Composable
fun GoodsDetail() {
    Column(modifier = Modifier.fillMaxSize(1f),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {
        Image(painter = painterResource(id = R.drawable.apple), contentDescription = "",modifier = Modifier.size(200.dp))
        Text(text = "安卓机器人",style = TextStyle(fontSize = 40.sp))
    }
}
复制代码
  1. 效果图

image.png


传递参数


我们将上面的例子进行一些改进,点击商品Item的时候将商品的id传入的详情页面展示。

直接上全部代码,如果上一节的demo仔细看了的话,那么直接看代码中的注释就ok:

  1. 代码
@Composable
fun Greeting(name: String) {
    val controller = rememberNavController()
    NavHost(navController = controller, startDestination = "goodsList") {
        composable("goodsList") {
            GoodsList(controller)
        }
        composable("goodsDetail/{goodsId}", arguments = listOf(navArgument("goodsId") {//路由中三部分的goodsId名称必须一致
            type = NavType.StringType//表示传递的参数是String类型
        })) {
            GoodsDetail(it.arguments?.getString("goodsId"))//获取商品id传递给GoodsDetail视图
        }
    }
}
@Composable
fun GoodsList(controller: NavHostController) {
    Column {
        (1..9).forEach {
            GoodsItem(controller, it)
        }
    }
}
@Composable
fun GoodsDetail(id: String?) {
    Column(
        modifier = Modifier.fillMaxSize(1f),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Image(
            painter = painterResource(id = R.drawable.apple),
            contentDescription = "",
            modifier = Modifier.size(200.dp)
        )
        Text(text = "安卓机器人: $id", style = TextStyle(fontSize = 40.sp))//这里将商品id展示出来
    }
}
@Composable
fun GoodsItem(controller: NavHostController, i: Int) {
    Column {
        Row(modifier = Modifier.clickable {
            controller.navigate("goodsDetail/$i")//这里将商品id拼接到参数后面
        }, verticalAlignment = Alignment.CenterVertically) {
            Image(painter = painterResource(id = R.drawable.apple), contentDescription = "")
            Text(text = "第件${i}件商品", modifier = Modifier.padding(start = 8.dp))
            Spacer(modifier = Modifier.weight(1f))
        }
        Divider(color = Color.Red)
    }
}
复制代码
  1. 效果

image.png


传递默认参数

我们可以在构建导航路由的时候使用defaultValue添加默认参数,代码如下:

composable("goodsDetail/{goodsId}", arguments = listOf(navArgument("goodsId") {//路由中三部分的goodsId名称必须一致
            type = NavType.StringType//表示传递的参数是String类型
            defaultValue="默认商品"
        })) {
            GoodsDetail(it.arguments?.getString("goodsId"))//获取商品id传递给GoodsDetail视图
        }
复制代码


首发后补充


跳转目标页面并销毁当前页面方法(20211217)

controller.popBackStack()
controller.navigate(HOME)



相关文章
|
Java Android开发 Windows
用Jetpack Compose Desktop做一个推箱子小游戏,演示键盘事件绑定的方式
做Windows桌面游戏是少不了与键盘交互的,不过其实并非我们做Windows桌面应用才需要小游戏,如果要做安卓机顶盒APP,也是要监听键盘的,只不过那是遥控器的键盘,方式其实也是一样的。
306 0
用Jetpack Compose Desktop做一个推箱子小游戏,演示键盘事件绑定的方式
|
4月前
|
自然语言处理 JavaScript 网络协议
简单使用vitepress快速搭建一个文档网站
VitePress 是一个静态站点生成器 (SSG),类似的项目有docsify、VuePress、hexo。用 Markdown 编写的内容生成可以轻松部署到任何地方的静态 HTML 页。
92 9
|
算法 图形学
Unity——DOTween插件使用方法简介
Unity——DOTween插件使用方法简介
871 0
|
存储 Android开发
Jetpack-Compose 学习笔记(六)——Compose 主题 Theme 一探究竟,换肤还能如此 Easy & Silky?(下)
Jetpack-Compose 学习笔记(六)——Compose 主题 Theme 一探究竟,换肤还能如此 Easy & Silky?(下)
250 0
|
XML 存储 Android开发
Jetpack-Compose 学习笔记(六)——Compose 主题 Theme 一探究竟,换肤还能如此 Easy & Silky?(上)
Jetpack-Compose 学习笔记(六)——Compose 主题 Theme 一探究竟,换肤还能如此 Easy & Silky?(上)
145 0
|
前端开发
Hugo教程#4基础布局
前几期学习了布局,本期学习一下布局更多的用法,比如partial和block,其中partial可以吧每个布局引用,block可作为布局的扩展
123 0
Hugo教程#2布局
如何知道布局的模板是什么呢,其实hugo内置了一个功能,可以创建一个空白主题
148 0
|
JavaScript
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
217 0
【Vue 开发实战】实战篇 # 45:如何构建可交互的组件文档让代码高亮的显示在页面
|
前端开发 JavaScript CDN
云间玉兔,自出机抒,从零开始制作Web插件网页特效小兔子组件(小挂件widget),基于原生CSS/NPM
著意登楼瞻玉兔,何人张幕遮银阙?又到了一年一度的网页小挂件环节,以往我们都是集成别人开源的组件,但所谓熟读唐诗三百首,不会做诗也会吟,熟读了别人的东西,做几首打油诗也是可以的,但若不能自出机抒,却也成不了大事,所以本次我们从零开始制作属于自己的网页小挂件,博君一晒。
云间玉兔,自出机抒,从零开始制作Web插件网页特效小兔子组件(小挂件widget),基于原生CSS/NPM
|
JavaScript 前端开发 Windows
Vue3移动端组件库Varlet源码主题阅读之一:本地启动服务时都做了什么
不同的组件库架构肯定有所不同,不过大体思路应该都差不多,笔者在众多组件库中挑选了[Varlet](https://github.com/varletjs/varlet) 来进行剖析,`Varlet`是一个基于 `Vue3` 开发的 `Material` 风格的移动端组件库,本系列的文章会全面解析这个项目,需要说明的是,不会具体的看某个组件是怎么实现的,而是了解组件库整体的设计,以及按需引入、主题定制、屏幕适配、组件打包、`VsCode`属性高亮等比较有意思的话题,话不多说,开始吧。
306 0