Compose-Navigation简单案例上手

news2024/9/29 11:32:44

Navigation 快速上手

下面案例简要展示使用 Compose 版本的 Navigation 库来实现两个页面之间的跳转

这是完整的结构(忽略掉红线划过的那个包)

在这里插入图片描述


安装适用于 kotlin 的 navigation 依赖

dependencies {
    implementation("androidx.navigation:navigation-compose:2.4.1")
}

编写欲跳转的两个页面

编写 Demo1 页面

子页面使用多个 composable 组件相组合的方法一一装配起来

Demo1main 渲染整个页面,他接受一个 NavController 对象,用于操纵导航相关的方法

可以注意到 Button 里面的点击事件还没写,后续我们写好路由后再回来编写跳转逻辑

@Composable
fun Demo1main(navController: NavController) {
    body(navController)
}

@Composable
private fun body(navController: NavController) {
    Column(
        modifier = Modifier
            .fillMaxSize()
    ) {
        Button(onClick = {
            // 跳转逻辑
        }) {
            Text(
                text = "前往demo2",
                modifier = Modifier.fillMaxWidth(),
                textAlign = TextAlign.Center
            )
        }
    }
}

编写 Demo2 页面

依葫芦画瓢

@Composable
fun Demo2main(navController: NavController) {
    body(navController)
}

@Composable
private fun body(navController: NavController) {
    Column(
        modifier = Modifier
            .fillMaxSize()
    ) {
        Button(onClick = {
            // 这里也写跳转逻辑!
        }) {
            Text(
                text = "前往demo1",
                modifier = Modifier.fillMaxWidth(),
                textAlign = TextAlign.Center
            )
        }
    }
}

路由表配置

编写单例类 RouteConfig 用来存储路由名称(等同于 vue-router 中我们设置的 path)

后续为便于理解,统称为 path

object RouteConfig {
    // 主页面
    const val ROUTE_MAIN = "main"

    // 两个跳转页面
    const val ROUTE_DEMO1 = "demo1"
    const val ROUTE_DEMO2 = "demo2"
}

总路由

创建文件 MainNav 并在里面实现路由导航的总逻辑

由于我们刚刚入门,路由表可以很简单,按照以下结构即可

  1. rememberNavController 存储所有 navcontroller 状态
  2. NavHost 一个容器,便于内部页面的切换,在里面注册所有页面
@Composable
fun AppNav() {
    // 存储navigation状态
    val navController = rememberNavController()

    // navhost容器
    // startDestination表示起始页的path,这里我们指定demo1作为起始页
    NavHost(navController = navController, startDestination = RouteConfig.ROUTE_DEMO1) {
        // 依次传入path并注册三个页面
        composable(RouteConfig.ROUTE_MAIN) {
            MainActivity()
        }
        composable(RouteConfig.ROUTE_DEMO1) {
            Demo1main(navController)
        }
        composable(RouteConfig.ROUTE_DEMO2) {
            Demo2main(navController)
        }
    }
}

主页面调用总路由

对于 kotlin 而言,非常简单,直接调用定义好的总路由方法即可

因为总路由默认起始页为 demo1,故渲染 mainactivity 后就会立即载入 demo1 页面!

class MainActivity() : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DemoComposeTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {

                    // 一键调用,方便快捷
                    AppNav()
                }
            }
        }
    }
}

跳转逻辑完善

嘿!还记得我们之前置空的按钮跳转逻辑吗?

我们已经配置完了所有路由,为此,仅需将以下代码添加到按钮点击事件即可跳转到指定页面了!

// 写于demo1页面,点击按钮后跳转到demo2页面
navController.navigate(RouteConfig.ROUTE_DEMO2)

为便于大家理解,现给出 demo1.kt 目前的完整代码

@Composable
fun Demo1main(navController: NavController) {
    body(navController)
}

@Composable
private fun body(navController: NavController) {
    Column(
        modifier = Modifier
            .fillMaxSize()
    ) {
        Button(onClick = {
            navController.navigate(RouteConfig.ROUTE_DEMO2)
        }) {
            Text(
                text = "前往demo2",
                modifier = Modifier.fillMaxWidth(),
                textAlign = TextAlign.Center
            )
        }
    }
}

demo2 的跳转逻辑只需要修改对应的 path 即可

目前仅学到了最简单的 navigate 跳转,后续还有带参跳转,请关注进阶版本!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

兼职任务平台收集(一)分享给有需要的朋友们

互联网时代,给人们带来了很大的便利。信息交流、生活缴费、足不出户购物、便捷出行、线上医疗、线上教育等等很多。可以说,网络的时代会一直存在着。很多人也在互联网上赚到了第一桶金,这跟他们的努力和付出是息息相关的。所谓一份耕耘&#…

使用kubeadm部署k8s1.24.0版本,遇到的坑总结

使用kubeadm部署k8s1.24.0版本,遇到的坑总结环境安装遇到的问题环境 操作系统:centos7 内核:5.4.231-1.el7.elrepo.x86_64 kubeadm:1.24.0 kubelet:1.24.0 kubectl:1.24.0 cri:docker cni&…

nginx rewrite 规则

生效位置 rewrite 可以写在 server 、 location、 if 配置段内 格式 rewrite regex replacement [flag] regex是匹配的正则表达式。 只会处理$request_uri部分,不会匹配$host replacement 是跳转的URI。 可以以http:// 或者https:// 开头, 也…

自适应多因素认证:构建不可破解的企业安全防线|身份云研究院

打开本文意味着你理解信息安全的重要性,并且希望获取行业最佳实践来保护你所在组织的信息安全。本文将带你了解多因素认证(MFA:Multi-Factor-Authentication)对于企业信息安全的重要性以及实施方法。 多因素认证(MFA&…

尚医通(十五)医院排班管理

目录一、医院排班管理需求1、页面效果2、接口分析二、科室列表(接口)1、添加service接口和实现2、添加DepartmentController方法三、科室列表(前端)1、添加隐藏路由2、封装api方法3、添加/views/hosp/schedule.vue组件四、排班日期…

torch相比于numpy都干了什么——torch入门

Torch已深度学习框架被熟知,但它首先是作为Numpy的存在。我们首先比较一下Torch和Numpy有什么不同,为什么可以实现深度学习。 从数据结构看起。Numpy的强大之处就在于array的数据结构,它是多维数组,要求所有元素是相同类型的&…

人与人之间赚钱的差距在哪里呢?体现在这几个因素中

同样生而为人,同样接受九年制义务教育的熏陶,但最终赚钱能力却千差万别,因此也就形成了我们所谓的圈层,阶层,穷人和富人。 一个人的赚钱能力跟什么有关?资源技能、学历、认知,这些都会决定一个人…

搞清楚动态库和静态库的区别

什么是库文件 一般来说,一个程序,通常都会包含目标文件和若干个库文件。经过汇编得到的目标文件再经过和库文件的链接,就能构成可执行文件。库文件像是一个代码仓库或代码组件的集合,为目标文件提供可直接使用的变量、函数、类等…

visual studio 改变界面语言

在使用visual studio 2019 时,开始是英文界面,后面变成了中文界面。但是看视频教学时有的是英文界面,我就想回到英文界面,所以有切换界面语言的需要。其实操作很简单:工具-> 选项 打开界面在界面里选择环境&#xf…

axios中的resolvePromise为什么影响promise状态

axios的取消请求意思很简单,就是在发送请求后不久停止发送请求 本文探讨的是v0.22.0之前的CancelToken API,因为在阅读源码交流的时候发现很多朋友不理解为什么CancelToken中的resolvePromise会影响到实例对象身上的promise状态 即下图所示代码&#xf…

为乡村振兴塑形铸魂,VR全景助力美丽乡村建设

民族要复兴,乡村必振兴,文旅部一直推动乡村文化产业和乡村旅游融合发展,大力推进乡村文化数字化,为乡村文化振兴注入新动能。为了更好的给乡村振兴塑形铸魂,VR智慧乡村助力数字化乡村建设发展,利用VR全景展…

CMD SET % 字符串截取

:: 使用 CSDN Cobol 格式化风格。:: *. 百分号 (%) :: (1) % 作为变量引导符,有几种用途:在命令行窗口中,用 1 个 % 引号变量; 在批处理文件中,用 2 个 % 引号变量。[1] 两个 % 夹着一个变量名称,表示取(扩…

HashMap如何避免内存泄露问题

HashMap对于Java开发人员来说,应该是一种非常非常熟悉的数据结构了,应用场景相当广泛。 本文重点不在于介绍如何使用HashMap,而是关注在使用HashMap过程中,可能会导致内存泄露的情况,下面将以示例的形式展开具体介绍。…

【Java】properties 和 yml 的区别

文章目录properties和yml的区别① 定义和定位不同② 语法不同③ yml更好的配置多种数据类型④ yml可以跨语言⑤ 总结properties和yml的区别 这几天刚好看到Spring Boot当中有两种配置文件的方式,但是这两种配置方式有什么区别呢? properties和yml都是S…

hadoop考试应急

概述 四大特点:大量化、快速化、多元化、价值化 关键技术:采集、存储管理、处理分析、隐私和安全 计算模式:批处理、流、图、查询分析计算 Hadoop处理架构 了解就好 2007年,雅虎在Sunnyvale总部建立了M45——一个包含了4000…

Leetcode 每日一题 2341. 数组能形成多少数对

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

《Java并发编程之美》- 线程终止的方法

多线程并发编程之美 等待线程执行终止的 join 方法 执行的代码 public class MyThreadThree {public static void main(String[] args) throws InterruptedException {Thread thread_anew Thread(()->{try {Thread.sleep(1000);} catch (InterruptedException e) {e.prin…

信息系统项目管理师真题精选(三)

1、以下关于我国现阶段电子政务建设的叙述中,不正确的是:( )。A.我国电子政务建设一直坚持统一规划,加强领导,需求主导,突出重点的原则B.我国电子政务建设一直坚持整合资源,拉动产业…

静态代理和动态代理的区别以及实现过程

前言 代理模式是一种设计模式,能够使得在不修改源目标的前提下,额外扩展源目标的功能。即通过访问源目标的代理类,再由代理类去访问源目标。这样一来,要扩展功能,就无需修改源目标的代码了。只需要在代理类上增加就可…

《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)

5.4 特权级深入浅出 5.4.1 特权级哪点事 计算机 访问 可分为访问者和被访问者。 建立特权机制为了通过特权来检查合法性。 0、1、2、3级,数字越小,权力越大。 0特权级是系统内核特权级。 用户程序是3特权级,被设计为“有需求就找操作系统”…