Compose Navigation导航使用的部分注意事项

文章目录

  • 一、前言
  • 二、使用判断条件进行显示隐藏和Navigation的区别
  • 三、Navigation和ViewModel的关系
  • 四、Navigation中替换页面的方式

一、前言

Android的项目架构中有一种由单个Activity,多个页面组成的架构。页面之前是由Fragment来承载显示,现在可以使用Compose来承载显示。在Compose中进行页面跳转切换除了使用判断条件进行显示隐藏外,使用Navigation能更好的对项目进行拓展维护。

二、使用判断条件进行显示隐藏和Navigation的区别

大部分项目应该还是使用Activity或者Fragment进行承载Compose页面。有时候单个页面中有不同的状态比如有数据状态或者无数据状态的UI的话,可以使用条件判断进行能显示隐藏。假如想将多个复杂页面放在一个Activity中。比如登录功能中的登录、注册等页面,那么使用判断来做会显得过于耦合。使用Navigation的话就能很好的解耦。每个页面都有自己的示例,算是另一个版本的Fragment

三、Navigation和ViewModel的关系

如果使用Navigation进行UI显示的话,那么除非每一个页面的ViewModel是由外部生成传递进来的,那么每一个Navigation页面之间的ViewModel实例都是一个单独的实例。例如以下示例:

@Compose
fun Root(){NavHost(modifier = modifier,navController = navController,startDestination = firstRoute) {composable(firstRoute) {FirstPage().FirstRoot()}composable(route = secondRoute,) {SecondPage().SecondRoot()}}
}class FirstPage {@Preview(showBackground = true, showSystemUi = true)@Composablefun FirstRoot(viewModel: MainViewModel = viewModel()){Box(modifier = Modifier.fillMaxSize(),){TextButton() {Text(text = "第一个页面")}}}
}class SecondPage {@Preview(showBackground = true, showSystemUi = true)@Composablefun SecondRoot(viewModel: MainViewModel = viewModel()){Box(modifier = Modifier.fillMaxSize(),){TextButton() {Text(text = "第二个页面")}}}
}

如上文所述,两个页面之间的ViewModel之间的数据是不互通的。除非从外部传入,或者有一个公共的地方保存同一个ViewModel示例

四、Navigation中替换页面的方式

Navigation默认会对切换的页面保存在一个堆栈里面,假如按返回键的话会回退的上一个页面。但是假如某个Activity进去后会根据状态不同显示某个页面,比如先进去的时候有数据,网络不好了,切换到无数据UI,这时候是不能回退到上个页面的,有两种方式一种就是拦截返回操作,第二个就是跳转过来时候清空堆栈。示例代码如下

//第一种
navController.navigate(secondRoute){popUpTo(navController.graph.startDestinationId) {inclusive = true // 包含起始目标在内的所有目标}
}
//第二种
navController.navigate(secondRoute){popUpTo(navController.graph.id) {inclusive = true // 包含起始目标在内的所有目标}
}

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

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

相关文章

Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意

Photoshop 2024是一款功能强大的图像处理软件,以其卓越的性能和广泛的应用领域,赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具,让用户能够轻松进行图片编辑、合成、校色、抠图等操作,实…

【0day】号卡sql注入

漏洞描述 号卡系统一键即可便捷快速的为您自己打造一个独立的属于你的号卡分销商城。此系统某接口存在SQL注入漏洞。 fofa语句 icon_hash"-795291075" 漏洞复现 构造payload nuclei验证 pocsuite3 验证 verify 验证 attack 验证 github poc总汇地址&#xff1a…

SpringBoot:自定义线程池配置类

文章目录 一、前言二、案例展示1、初始版本2、代码审核意见和优化建议3、潜在问题和风险4、优化建议5、优化后的代码 三、具体使用 一、前言 有时候我们在项目中做一些长链路的跑批任务时,基于Springboot项目的定时任务,我们可以指定一个自定义的线程配…

无极低码:同时删除两张表中的记录

原始需求:删除两张表用户id为44的数据记录 删除user_info表中u_id为44的用户 DELETE FROM user_info WHERE u_id 44; 删除user_org_rel 表中u_id为44的用户 DELETE FROM user_org_rel WHERE u_id 44; 简便写法:用工mysql写法一次执行两张表删除 &…

深入理解WebSocket:实时双向通信的利器

一、介绍 1.1 基础概念介绍 单工通信:数据传输只允许在一个方向上传输,只能一方发送数据,另一方接收数据并发送。半双工:数据传输允许两个方向上的传输,但在同一时间内,只可以有一方发送或接收数据。全双…

SpringBoot集成Mysql

一、概述 Spring Boot是一个用于简化Spring应用开发的框架,它提供了很多默认配置,使得开发者能够快速地集成各种技术和组件,包括MySQL数据库。在Spring Boot中集成MySQL,我们通常会使用Spring Data JPA或MyBatis等持久层框架&…

Python中的全栈开发前端与后端的完美融合【第160篇—全栈开发】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的全栈开发:前端与后端的完美融合 全栈开发已成为当今软件开发领域中的…

代克斯特拉演算法C代码

代克斯特拉演&#xff08;Dijkstra&#xff09;算法是一个用于找出图中单源最短路径问题的算法。下面是一个使用C语言实现的Dijkstra算法的例子。这个例子假定图是以邻接矩阵的形式表示的&#xff0c;并且图中的边权重是非负的。 #include <stdio.h> #include <limit…

华为OD机试 - 查找舆情热词(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

vue3性能提升主要通过哪几方面?

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;Vue &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 编译优化diff算法优化提取动态节点 静态提升预字符串化缓存内联事件处理函数SSR优化 源…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/1]

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

Python高级技术应用:解锁异步编程的威力与实践

在当今软件开发的领域中,异步编程已经成为一种重要的技术手段,特别是在处理高并发和I/O密集型任务时。Python作为一种功能丰富且灵活的编程语言,提供了多种方式来实现异步编程,如使用asyncio库、async/await关键字等。本文将深入探讨Python中异步编程的原理、优势以及实际应…

HackTheBox-Machines--Topology

文章目录 1 端口扫描2 漏洞探测三 权限提升 Topology 测试过程 1 端口扫描 nmap -sC -sV 10.129.23.122 漏洞探测 端口扫描发现22和80端口&#xff0c;访问80端口&#xff0c;发现LaTeX方程生成器&#xff0c;访问该按钮发现子域&#xff1a; latex.topology.htb。 将域名添加…

超图新建三维数据集继续学习

1 新建三维数据集 之前操作过新建三维数据集&#xff0c;还不熟悉&#xff0c;继续熟悉&#xff1b; 现在有一个文件型的数据源&#xff0c;名为swtest1&#xff1b;它前面小图标上有UDX三个字母&#xff0c;表明这是一个UDX类型的数据源&#xff1b;在此数据源上右击&#x…

李白打酒加强版(c++实现)

题目 话说大诗人李白&#xff0c;一生好饮。 幸好他从不开车。 一天&#xff0c;他提着酒壶&#xff0c;从家里出来&#xff0c;酒壶中有酒 2 斗。 他边走边唱&#xff1a; 无事街上走&#xff0c;提壶去打酒。 逢店加一倍&#xff0c;遇花喝一斗。 这一路上&#xff0c;…

【观察者模式】

观察者模式 什么是观察者模式&#xff1f; 观察者模式定义了对象之间的一种一对多依赖关系&#xff0c;允许多个观察者对象同时监听某一个主题对象。这种模式是事件驱动编程的核心&#xff0c;其主要目标是实现对象间的松耦合。松耦合的设计允许我们构建灵活的系统&#xff0…

SSH端口转发

SSH介绍 SSH通过网络远程访问主机提供保护&#xff0c;可以对客户端和服务端之间的数据传输进行压缩和加密&#xff0c;有身份验证、SCP、SFTP、和端口转发的功能 SSH转发常用的参数介绍&#xff1a; -C请求压缩所有数据-D动态转发、即socks代理-f后台执行SSH指令-g允许远程…

hxp CTF 2021 - A New Novel LFI(新颖的解法)

一、环境 unbentu&#xff0c;docker https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz 二、解析 PHP Filter 当中有一种 convert.iconv 的 Filter &#xff0c;可以用来将数据从字符集 A 转换为字符集 B &#xff0c;其中这两个字符集可以…

极狐GitLab 13.11 重磅发布多项与 DevSecOps 相关的功能【五】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

我的一年创作纪念日

机缘 实际上在之前的文章之中我已经介绍过自己与csdn的缘分了&#xff0c;当初对算法十分的痴迷&#xff0c;也很希望能够将自己的一些理解写在csdn上&#xff0c;所以就开始了在csdn上的写作。 收获 在创作过程中最大的收获还是对过去所学的知识的总结吧&#xff0c;可惜的就…