Android Compose Bloom 项目实战 (五) : 使用Navigation实现页面跳转

news2024/11/24 11:25:00

1. 前言

上几篇文章 我们分别实现了 Compose Bloom项目的各个页面,包括欢迎页、登录页和主页,但是各个页面都是单独独立的,并没有关联页面跳转,而本篇文章的任务就是实现各个页面见的跳转。

在这里插入图片描述

2. Navigation

要实现页面跳转,需要使用Navigation,看到这个API,大家是不是感觉有点熟悉,对的,其实这个就是我们在传图View体系中用到的的Navigation。在Compose中,JetPack中的很多库都对Compose进行了适配,包括本文的Navigation

3. 添加依赖

首先,我们需要在Gradle中添加相关依赖

def nav_version = "2.5.2"
//implementation "androidx.navigation:navigation-fragment:$nav_version"
//implementation "androidx.navigation:navigation-ui:$nav_version"
implementation "androidx.navigation:navigation-compose:$nav_version"

4. 创建NavHost

NavHost用来配置页面的路由URL,需要传入NavController
NavController是导航的管理者,内部维护着页面跳转过程的返回栈。
通过调用navController.navigate("路由URL")来跳转到具体的页面。

我们在MainActivity中新建名叫AppNavigationComposable函数,用作创建NavHost
然后修改MainActivitysetContentAppNavigation

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

		//沉浸式状态栏
        WindowCompat.setDecorFitsSystemWindows(window, false)
        val controller = WindowCompat.getInsetsController(window, window.decorView)
        controller?.isAppearanceLightStatusBars = true

        setContent {
            BloomTheme {
                AppNavigation()
            }
        }
    }

    @Composable
    private fun AppNavigation() {
        val navController = rememberNavController()
        NavHost(navController = navController) {
            
        }
    }
}

5. 设置默认启动页面

通过NavHoststartDestination,我们可以设置默认跳转的页面
我们这里定义了WelcomePage路由为welcome,并通过将startDestination 设置为welcome,使其成为App默认启动的Compose页面
WelcomePage传入了navController

NavHost(navController = navController, startDestination = "welcome") {
	composable("welcome") {
       WelcomePage(navController)
	}
}

这里将NavController传入了子Composable
其实更好的方式是子Composable通过回调操作NavController
跳转逻辑放在一起会更清晰,也方便单元测试

6. 欢迎页跳转到登录页

首先需要在NavHost中再添加登录页,路由我这里取为login

NavHost(navController = navController, startDestination = "welcome") {
     composable("welcome") {
         WelcomePage(navController)
     }
     composable("login") {
         LoginPage(navController)
	}
}

然后,在WelcomePage中,点击login按钮的时候,调用navController.navigate("login"),路由传的是login,即会跳转到登录页面了。

TextButton(onClick = {
    navController.navigate("login")
}, modifier = Modifier.padding(16.dp)) {
    Text(
        text = "Log in",
        style = button,
        color = pink900)
}

7. 登录页面跳转到主页,并传入参数

我们来看下怎么传递参数,以登录页面跳转到主页为例,我们希望传入用户ID到主页。
首先我们在NavHost中定义HomePage的路由为userId

composable("home") { backStackEntry ->
	HomePage(navController)
}

然后怎么获取userId呢 ? 需要修改下路由为home/{userId},这个的参数需要用大括号{}包裹

composable("home/{useId}")

这里设置的传递类型是String,所以通过getString获取

backStackEntry.arguments?.getString("userId")

默认情况下传递类型就是String

再来看一下完整的主页路由配置的代码

composable("home/{userId}") { backStackEntry ->
    HomePage(navController, backStackEntry.arguments?.getString("userId"))
    navArgument("userId") {
        type = NavType.StringType //设置传递类型为String
    }
}

接着,在登录页,点击登录按钮的时候,跳转该路由就可以了

Button(
    onClick = {
        navController.navigate("home/123")
    }, modifier = Modifier
        .padding(horizontal = 16.dp, vertical = 16.dp)
        .height(48.dp)
        .fillMaxWidth()
        .clip(medium),
    colors = ButtonDefaults.buttonColors(backgroundColor = pink900)
) {
    Text(text = "Log in", style = button, color = white)
}

在主页上,我们打印下userId,可以看到显示结果为 userId:123

@Composable
fun HomePage(navController: NavHostController, userId: String?) {
    Log.i("HomePage", "userId:$userId")
    //省略...
}

8. 来看下页面跳转效果

在这里插入图片描述
至此,我们就完成了Compose页面间跳转的功能

9. 其他

Compose 项目实战 系列文章
Android Compose Bloom 项目实战 (一) : 项目说明与配置
Android Compose Bloom 项目实战 (二) : 欢迎页
Android Compose Bloom 项目实战 (三) : 登录页
Android Compose Bloom 项目实战 (四) : 主页

本文源码 : ComposeBloom

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

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

相关文章

Jetpack Compose动画实现原理详解

一、简介 Jetpack Compose是Google推出的用于构建原生界面的新Android 工具包,它可简化并加快 Android上的界面开发。Jetpack Compose是一个声明式的UI框架,随着该框架的推出,标志着Android 开始全面拥抱声明式UI开发。Jetpack Compose存在很…

【数据结构】红黑树封装map和set

文章目录 1.前置知识2.结构的改写与封装2.1 map和set的结构框架2.2 RBTreeNode结构的改写2.3 RBTree结构改写(仿函数的引入) 3. 迭代器3.1 RBTree的迭代器3.2 map和set的迭代器封装 4. 插入的改写和operatorp[]的重载4.1 insert的改写4.2 map::operator[…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→DVPP

1 数据预处理概述 1.1 典型使用场景 受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时…

pytest-编写插件

pytest 0 、文档1、钩子函数分类1.4 测试运行钩子 2、本地编写插件:conftest.py3、外部插件:setuptools4、实战 0 、文档 官方文档 中文文档 1、钩子函数分类 pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收…

rtl仿真器-incisive安装和测试

需要的文件 安装文件 incisive : http://pan.baidu.com/s/1dFC9KZn 提取码 k3cb path: license: IScape: 安装的图形界面 IScape下载链接: https://pan.baidu.com/s/1FvpOto5fAIRjQARcbMbjZQ 密码: k1cb 目录结构 需要四个目录 安装目录:INCISIVE151 path 存放解密工具 l…

强化学习路线规划之深度强化学习

学到如今,我实在明白了一个至关重要的东西,那就是目标很重要,有了清晰的目标我们就知道该做什么,不至于迷茫,否则每天都在寻找道路。所以我一直在规划这样一条道路,让想学习的人可以抛下不知道该怎么做的顾…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验(二)

大家好,我是瓜叔。 notion AI在工作和生活场景中的应用 我们先来看"总结"功能。 这边有一篇文章叫做学习编码的好处。导入到nation https://www.likecs.com/show-203992587.html 导入方法详见上一篇文章:在Notion AI 中轻松打造您的AI私人助理…

VMware快照:简化虚拟化环境管理与数据保护

引言: 在虚拟化环境中,数据保护和灵活性是至关重要的。VMware快照作为一项强大的功能,为虚拟机管理者提供了便利和安全性。本文将介绍VMware快照的使用,以及它为用户带来的几个关键优势。 VMware快照是一项重要的功能&#xff0c…

Threejs进阶之十五:在Thereejs 使用自定义shader

目录 最终效果什么是 ShaderShaderMaterial类常用属性uniforms属性vertexShader属性fragmentShader属性 代码实现新建ShaderView.vue文件并引入Threejs定义初始化函数创建initMesh函数实例化ShaderMaterial类实例化TextureLoader()定义uniforms 全局变量定义vertexShader顶点着…

ad18学习笔记二:绘图工具栏、活动栏

在画原理图库的时候会经常用到顶上的绘图工具栏(官方文档里叫做活动栏): 版本不同,上面的命令是不同的 ad如何自定义绘图工具栏? 网上介绍工具栏和设置的文章还挺多的,但是没有看到ad18是怎么增减绘图工具…

LeetCode高频算法刷题记录7

文章目录 1. 下一个排列【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 两数相加【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 括号生成【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 滑动窗口最大值【困难】4.1 题目描述4.2 解题思路4.3 代码实现 5. 最小覆盖子串…

c++boost库学习-07-Message Queue

一、前言 boost中的消息队列(Message Queue)是进程间通信的一种机制,实际上是其内部也是采用共享内存的方式来达到进程间通信的目的。这也就意味这Message Queue有其局限性:只有处在同一台计算机中的不同进程才能使用消息队列进行…

在原有机械硬盘的基础上集装固态硬盘并装操作系统

1、加装固态硬盘 我的电脑出场自带的是机械硬盘(即右边那个白色长方形,上面有类似于锡纸一样的东西),左边的这个光滑的正方形里面是内存条,可以拆开这个光滑的盖进行安装,而我们的固态硬盘装在左下角这个长…

性能测试——性能统计工具

性能统计工具 一、io监控命令1、io监控命令iostat2、io指标监控命令df 二、cpu监控命令1、cpu指标监控命令uptime2、cpu指标监控命令 cat /proc/cpuinfo3、cpu 指标监控命令 mpstat4、cpu指标监控命令 sar 三、mem指标监控命令1、mem指标监控命令 cat /proc/meminfo2、mem指标监…

KVM虚拟化(二)

文章目录 4.7 kvm虚拟机克隆4.7.1 完整克隆4.7.2 链接克隆 4.8 kvm虚拟机的桥接网络4.8.1 创建桥接网卡4.8.2 新虚拟机使用桥接模式4.8.3 将已有虚拟机网络修改为桥接模式 4.9 热添加技术4.9.1 kvm热添加硬盘4.9.2 kvm虚拟机在线热添加网卡4.9.3 kvm虚拟机在线热添加内存4.9.4 …

自动化测试技术解析:Appium、Sikuli与MonkeyTalk

目录 前言: 一、Appium自动化测试框架 它的优点是: 二、Sikuli自动化测试工具 它的优点是: 三、MonkeyTalk自动化测试工具 它的优点是: 四、代码样例 总结: 前言: 随着移动应用的普及,…

手把手教你通过PaddleHub快速实现输入中/英文本生成图像(Stable Diffusion)

近来,基于Diffusion的文图生成模型比较火,用户输入一句话,模型就可以生成一副对应的图像,还是很有意思的。本文记录了通过PaddleHub快速实现上述任务的过程,以供参考。 1、安装PaddlePaddle PaddleHub底层依赖于百度…

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式 一、提出需求如何撰写百度地图标注开发的需求文档 二、针对性地连续提问推荐下一下百度地图标注文档的详细需求列表如何撰写百度地图标注开发的技术规范如何确定百度地图标注开发后的部署计划... 三、生成报价单四、运营…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→模型推理

1 模型离线推理 各步要解析如下: Host&Device内存管理与数据传输: Host&Device上的内存申请与释放,内存间的相互拷贝;模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。模型输入输出准备∶根据禹线om的输入输出,在Device…

微信小程序富文本组件mp-html

功能介绍 支持在多个主流的小程序平台和 uni-app 中使用支持丰富的标签(包括 table、video、svg 等)支持丰富的事件效果(自动预览图片、链接处理等)支持设置占位图(加载中、出错时、预览时)支持锚点跳转、…