Jetpack: 使用自定义 NavType 组合导航

Jetpack Compose Navigation实战:从基础到高级导航模式 本文全面解析Jetpack Compose Navigation在Android开发中的应用,从基础导航实现到高级模式(如单任务/单顶模式),涵盖参数传递、嵌套导航、深层链接等核心功能。通过实战代码示例展示如何优化导航性能,并与ViewModel、Hilt等架构组件整合,为开发者提供高效的Compose导航解决方案。 阅读详情

导航是指允许用户浏览、进入和退出应用程序中不同内容的交互。Navigation 库还提供了一个特定的工件,以在使用 Jetpack Compose 构建的屏幕中实现一致且惯用的导航。

当使用 jetpack compose 导航时,我们使用NavHost可组合定义了一个导航主机,它提供了一个 lambda 函数,我们可以在其中将目的地添加到NavGraphBuilder.

假设我们希望在ScreenA和之间导航ScreenB 它看起来像

NavHost(navController = navController, startDestination = "ScreenA") {
    composable("screen-a") { ScreenA(/*...*/) }
    composable("screen-b") { ScreenB(/*...*/) }
}

默认情况下,所有参数都被解析为字符串

正如文档所说,导航组合还支持在可组合目的地之间传递参数,默认情况下,所有参数都被解析为字符串。

NavHost(startDestination = "screen-a") {
    ...
    composable(
        "screen-b/{id}",
        arguments = listOf(navArgument("id") { type = NavType.StringType })
    ) {
           ScreenB(/*...*/)
      }
}

您应该NavArguments从函数NavBackStackEntry的 lambda 中可用的 中提取composable()。

composable("screen-b/{id}") { backStackEntry ->
    ScreenB(id = backStackEntry.arguments?.getString("id"))
}

要将参数传递给目的地,您需要将值添加到路由中以代替调用中的占位符以进行导航:

navController.navigate("screen-b/1")

创建自定义数据类型

上述方式在大多数情况下都有效。您只需传递 id,然后从数据库中获取附加信息。但有时您只想将数据传递到另一个屏幕而不做额外的请求。

Jetpack 导航组件允许我们创建自定义 NavType。

NavType表示可以在 a 中使用的类型NavArgument。

假设我们想将自定义的Post数据类型传递给 ScreenB

data class Post(val id: Int,val title: String,val content: String)

我们可以创建一个“Post NavType”,Post 必须首先是可包裹的。

@Parcelize
data class Post(val id: Int,val title: String,val content: String) : Parcelable

然后我们可以创建 PostType 类

class PostType : NavType<Post>(isNullableAllowed = false) {
    override fun get(bundle: Bundle, key: String): Post? {
        return bundle.getParcelable(key)
    }

    override fun parseValue(value: String): Post {
        return Gson().fromJson(value, Post::class.java)
    }

    override fun put(bundle: Bundle, key: String, value: Post) {
        bundle.putParcelable(key, value)
    }
}

PostType 从具有 Post 数据类作为类型参数的 NavType 扩展,我还使用 Gson 来反序列化 Post from 参数,该参数将是一个 json,但您可以使用您喜欢的转换器。

检索数据

我们必须更新 NavGraph 才能检索帖子

NavHost(startDestination = "screen-a") {
    ...
    composable(
        "screen-b/{post}",
        arguments = listOf(navArgument("post") { type = PostType() })
    ) {
           val post = it.arguments?.getParcelable<Post>("post")
           ScreenB(post)
      }
}

导航

现在的问题是如何将帖子作为参数传递。首先,我们必须序列化,然后将其编码为 uri。

/*...*/
onclick = {
    val post = Post(1, "My post", "this is my wonderfull post content")
    val json = Uri.encode(Gson().toJson(post))
    navController.navigate("screen-b/$json")
}
/*...*/

这很好用,但是我们可以创建一个函数来封装序列化行,在我的例子中是一个重载的toString()方法。

override fun toString(): String {
    return Uri.encode(Gson().toJson(this))
}

现在我们可以使用字符串插值

/*...*/
onclick = {
    val post = Post(1, "My post", "this is my wonderfull post content")
    navController.navigate("screen-b/$post")
}
/*...*/

结论

尽管 Jetpack Compose 团队不建议在导航可组合路由中传递 Parcelable,但有时您可能仍需要传递自定义数据类型作为参数,我希望这篇博文可以帮助您…

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击文末卡片免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

Compose | UI组件(十五) | Navigation-Data - 高效传递复杂数据的页面导航实践 本文深入探讨了在Jetpack Compose Navigation中高效传递复杂数据的实践方法。针对电商等场景中传递商品对象等结构化数据的需求,文章详细介绍了如何通过自定义NavType集成Parcelable对象,实现类型安全且优雅的页面间数据传递,并涵盖了集合、嵌套对象处理及性能优化等最佳实践。 阅读详情

相关推荐

Android Compose导航架构与最佳实践

现代Android开发中,Jetpack Compose的导航系统通过NavHostController实现了纯函数式界面管理,相比传统Fragment导航具有状态驱动、类型安全和性能优化三大优势。导航架构作为应用骨架,其核心原理是通过Kotlin DSL定义类型安全路由,配合Compose的重组机制实现高效渲染。在工程实践中,合理使用rememberNavController保持状态、采用密封类规范路由定义、结合Hilt管理ViewModel生命周期,能显著提升大型项目的可维护性。特别是在多模块开发场景下

weixin_29178069的博客 255

【尚品汇】(三)完成TypeNav模块

使用普通函数,this指向vc组件实例对象(因为throttle返回一个函数,当鼠标移入,就会触发此函数,不管是内联事件处理器,还是方法事件处理器,此函数内的this都指向vc或者vm)谁调用的函数,this当然就指向谁喽!当用户操作很快时,移入的一级分类都应该触发鼠标进入事件,但是经过测试,只有部分的一级分类被触发了。鼠标移出一二三级分类、“全部商品分类"时,不会触发"鼠标移出事件”,只有鼠标移出父元素时,才会触发父元素的"鼠标移出事件",currentIndex才会变成-1。

m0_45295314的博客 929

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1045

【尚品汇】Day2笔记---- TypeNav组件的实现

因为要与服务器进行请求与响应,返回Promise异步函数,所以要用async和await对reqCategoryList函数进行包装,将其变成同步函数,等接收到数据后再向下进行。将TypeNav组件中的数据从服务器中获取,因为数据要经常使用,需要将数据存放在Vuex(仓库)中。1.TypeNav是属于home组件,为了方便维护,在store中专门设置home仓库,进行模块化。3.TypeNav组件获取state数据。要注意命名空间时,函数名和数据名的写法。4.用v-for,将数据进行替换。

wsj2311161832的博客 338

树莓派作为Modbus服务器:pymodbus配置全记录

手把手教你用树莓派部署Modbus服务器,核心基于pymodbus实现数据通信与设备控制,涵盖配置步骤与常见问题,适合工业自动化场景应用。

weixin_42510201的博客 756

贝叶斯校准在计算机模型不确定性分析中的实践指南

本文深入探讨了贝叶斯校准在计算机模型不确定性分析中的核心原理与实践方法。通过将模型从“黑箱”转变为“透明箱”,该方法系统量化了参数不确定性、模型结构缺陷及观测误差。文章重点阐释了如何利用高斯过程作为代理模型和模型不足函数,构建完整的贝叶斯校准框架,并提供了从数据准备、模型训练到MCMC推断及不确定性分析的实战指南,最终实现更可靠的预测与决策支持。

weixin_29088655的博客 292

compose navigation 自定义navtype

navController.navigate 直接放入带自定义参数的 route,在接收端,通过 toRoute直接获取组装后的带自定义参数的route,但是前提条件是,需要注册号typeMap。可以看到 DogDetailRoute带了两个参数,一个是自定义类型Dog。大部分情况下,我们应该是传狗的ID,然后在狗详情界面,通过查询本地数据库or API,去获取狗详情信息。通过自定义navtype可以方便的在导航过程中,传递自定义参数。即两个页面,一个狗列表页面,点击列表项,进入狗详情界面。

github_35581409的博客 489

STM32与SD卡SPI接口硬件设计:从原理图到调试的完整指南

SPI(串行外设接口)作为一种广泛应用的同步串行通信协议,以其接线简单、驱动成熟的特点,成为连接微控制器与各类外设的经典方案。其工作原理基于主从架构,通过时钟、数据线和片选信号实现全双工通信,在嵌入式系统中具有极高的技术价值,常用于连接传感器、存储设备和显示模块等。在数据存储场景中,SD卡凭借其大容量和便携性成为首选,而通过SPI模式驱动SD卡,则平衡了性能与设计复杂度。本文聚焦于使用Altium Designer进行硬件设计的工程实践,详细解析了STM32微控制器与SD卡通过SPI通信时,电源管理、上拉电

weixin_34101784的博客 555

Compose版本的Navigation组件的使用

在原生中,官方比较推荐使用单Activity+多Fragment模式来构建一个APP,而Fragment的切换需要使用FragmentManager来进行管理,比如add replace等方法,对于开发者来说,也是比较繁琐,于是官方在Jetpack组件中就是推出了Navigation的库,可以方便开发者快速去管理多Fragment的页面堆栈问题

m0_56255097的博客 2865

Logstash安装部署

1. 部署及安装所用的用户不能是root。

lmj3732018的博客 4296

自动化控制软件:Beckhoff TwinCAT二次开发_(7).HMI开发基础

TwinCAT HMI是Beckhoff公司为TwinCAT自动化平台开发的专用HMI软件。Web技术基础:基于Web技术,支持HTML5、CSS3和JavaScript,可以轻松集成第三方库和框架。多平台支持:可以在多种设备上运行,包括PC、平板电脑和智能手机。高效开发:提供丰富的组件库和开发工具,简化开发过程。安全性:支持多种安全机制,确保数据和系统的安全性。可扩展性:支持自定义组件和脚本,满足不同应用场景的需求。Button:按钮组件,用于触发操作。Label:标签组件,用于显示文本信息。

2401_87715305的博客 988

Jetpack 核心组件升级实战:Navigation 3.X、Lifecycle+Flow、ViewModel 与 Hilt 的深度整合

2024年Jetpack核心组件迎来重大升级,Navigation 3.X实现动态导航图构建和深链接增强,Lifecycle与Flow深度绑定解决内存泄漏问题,ViewModel强化状态管理并推荐StateFlow替代LiveData,Hilt简化依赖注入流程。本文从原理、实战和优势三个维度解析升级亮点,展示如何整合这些组件构建高效Android应用,涵盖动态导航、安全数据收集、状态管理优化等场景,并提供版本兼容性等常见问题的解决方案。Jetpack系统性升级围绕高效开发、稳定可靠和性能优化三大目标,为开发

lollapalooza1的博客 1284

ADAMS软件二次开发:ADAMS软件API接口详解

API(Application Programming Interface,应用程序编程接口)是一种允许不同软件应用程序之间进行交互的接口。在ADAMS软件中,API提供了与软件内部功能直接交互的能力,使用户能够通过编写自定义代码来扩展软件的功能,实现自动化操作或集成到其他系统中。ADAMS软件的API主要基于C++和Python,允许用户通过这些编程语言来访问和控制ADAMS的模型、仿真和分析功能。API接口的使用,需要对编程语言有一定的了解,同时也需要熟悉ADAMS软件的基本操作和模型结构。

kkchenjj的博客 1865

如何用Jetpack Compose打造Android Sunflower应用的底部导航栏:从View到Compose的完整迁移指南

Android Sunflower是一个展示最佳开发实践的园艺应用,特别展示了如何将基于View的应用迁移到Jetpack Compose。本文将详细介绍如何在Sunflower应用中实现现代化的底部导航栏,帮助开发者理解Compose导航组件的核心用法和迁移策略。 [![Sunflower应用界面展示](https://raw.gitcode.com/gh_mirrors/su/sunflow

gitblog_00356的博客 766

MuJoCo 入门教程(一)

在 MuJoCo 仿真中输入自定义数字有三种方法。首先,可在 XML 中定义全局数字字段。它们有一个名称和一个实数值数组。其次,可以通过特定元素的自定义数组来扩展某些模型元素的定义。具体方法是在 XML 元素大小中设置 nuser_XXX 属性。第三,数组 mjData.userdata 不用于任何 MuJoCo 计算。用户可以在这里存储自定义计算的结果;请记住,所有随时间变化的内容都应存储在 mjData 中,而不是 mjModel 中。自定义文本字段可以保存在模型中。

机器人控制与仿真应用 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Jetpack Compose Navigation 遇上类型安全

Host—— 在您的布局中显示当前“目标”(destination)的 UI 元素。Graph—— 定义应用程序中所有可能的目标的数据结构。Controller—— 管理目标之间导航并保存目标的后向堆栈的中央协调器。Kotlin DSL 只是构建导航图的一种方式。手动构造 NavGraph 实例并添加目标(例如 Fragment 目标)以构建图。从导航 XML 文件中膨胀您的图,并手动编辑它或通过导航编辑器进行编辑。使用 Kotlin DSL 直接在 Kotlin 代码中构建导航图。

虎哥LoveDroid 1064

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Jetpack Compose导航实战:从基础到电商应用

现代Android开发中,声明式UI框架Jetpack Compose正在重塑导航系统的实现方式。导航作为应用架构的核心组件,其设计直接影响用户体验和代码可维护性。Compose导航采用基于路由的状态驱动模式,通过NavController集中管理跳转逻辑,这种函数式编程范式相比传统的Intent方式更具可预测性和组合性。在电商等高交互场景中,合理运用参数传递、嵌套导航和状态恢复等技巧,能有效解决页面跳转、深层链接等工程难题。本文以实际项目为例,详解如何构建符合MAD(Modern Android Deve

weixin_31856057的博客 288

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Jetpack Compose导航实现与最佳实践

现代Android开发中,声明式UI框架Jetpack Compose通过状态驱动的方式重构了界面导航机制。导航系统作为应用架构的核心组件,其设计直接影响着代码可维护性和用户体验。Compose导航基于NavController和NavHost等核心组件,实现了类型安全的路由管理和参数传递,有效解决了传统Intent跳转的耦合问题。在实际开发中,结合ViewModel状态管理可以构建高内聚低耦合的导航架构,特别适合电商、社交等需要复杂页面流转的场景。通过路由参数化、深层链接支持等特性,开发者能够实现从基础跳

weixin_31309419的博客 293

Jetpack:019-Jetpack的导航二(传递数据)

本章回主要介绍了导航中如何通过参数传递数据 ,主要介绍了传递数据和获取数据的方法,另外还介绍了另一个传递数据的方法:compositionLocal。它是相对独立的知识,大家可以单独去学习。导航过程中传递数据 有详细的示例代码,大家可以参考,最后,我们对本章回的内容做了统一的总结。

talk_8的专栏 430

Jetpack Compose 的 Navigation学习

Navigation是 Jetpack 用于 Android 导航的组件,作用是处理页面跳转,以及页面跳转过程中的交互。使用Navigation,你就需要为每个页面设定一条唯一路径,它是一个 String 常量,形式是 DeepLink 的样子,从一个页面跳转到另一个页面,它通过输入目的地的路径进行转跳。Navigation也支持上 Compose,我们可以在 Compose 中使用它来进行跳转。因为官网和所看到的demo都是把它作为跳转能力使用,所以不清楚 Compose 是否还有别的跳转方式….....

RikkaTheWorld 2129

Jetpack Compose类型安全导航:Compose Destinations 2.x实战指南

在Android应用开发中,页面导航是架构设计的关键一环。Jetpack Compose 虽然提供了 Navigation-Compose 组件,但字符串路由和手动传参的方式在项目复杂度提升后暴露出类型安全缺失、样板代码繁多等痛点。基于注解处理器与 KSP 的编译期代码生成技术,能够将路由定义与参数解析自动化,从根本上提升导航的健壮性与可维护性。这种思路适用于大型项目中的底部导航、对话框、深链跳转以及依赖注入等典型场景。本文围绕 Compose Destinations 2.x 展开,系统讲解其核心注解、导

weixin_33824385的博客 337

Jetpack Compose导航组件实践与优化指南

现代移动应用开发中,页面导航架构直接影响用户体验和代码可维护性。Jetpack Compose作为Android官方推荐的声明式UI框架,其导航组件通过Kotlin DSL实现了类型安全的导航逻辑,相比传统Fragment方案可减少40%模板代码。核心原理在于NavController与Compose生命周期的深度集成,支持路由参数化、嵌套导航图和状态保存等特性。在电商、社交等高频交互场景中,合理运用条件导航和返回栈管理能显著提升流程连贯性。本文以navigation-compose 2.7.5为例,详解从

weixin_31236101的博客 236

京墨导航系统解析:Navigation Compose在复杂应用中的应用

京墨作为一款开源的中华文化阅读APP,集成了诗词、汉字、成语、传统节日等丰富内容。为了在单一应用中实现复杂的页面跳转和状态管理,项目采用了Jetpack Navigation Compose组件构建高效导航系统。本文将深入解析Navigation Compose在京墨应用中的架构设计与实践技巧,帮助开发者掌握复杂Android应用的导航实现方案。 ## 导航架构总览:单Activity多Comp

gitblog_00558的博客 456

【Jetpack Compose娓娓道来】 第5课:导航与多页面——告别Fragment的跳转噩梦

本文系统讲解Compose导航机制,对比传统View体系的繁琐,引出Navigation Compose的必要性。通过创建NavController与NavHost,定义路由表实现页面跳转,结合navigate()与popBackStack()完成导航控制。重点演示了参数传递(路径参数)、返回栈管理、系统返回键处理等核心功能,并强调页面与导航解耦的最佳实践,使多页面应用开发更简洁、安全、可维护。

jackchuanqi的博客 115

Jetpack Compose Navigation核心原理与生产实践指南

Jetpack Compose Navigation并非Fragment Navigation的简单移植,而是一种以状态驱动、组合式UI和类型安全为基石的现代导航范式。其核心在于将导航抽象为可观察的状态流(NavBackStackEntry),通过NavController协调命令与状态双通道,实现UI重组与路由变更的严格解耦。该机制天然支持深度链接自动解析、强类型路由参数(NavType)、跨Tab返回栈隔离及SavedStateHandle持久化等关键能力,显著降低Fragment事务管理复杂度与状态同

weixin_34331102的博客 368

Jetpack Navigation 深度指南:从页面跳转到架构锚点

Jetpack Navigation 是 Android 官方导航框架,其核心并非简单的 Fragment 跳转封装,而是以声明式 NavGraph 为载体的状态流控制系统。它通过目的地(Destination)抽象解耦 UI 与导航逻辑,依托 Safe Args 实现编译期参数校验,结合 Deep Link 构建跨平台状态同步能力,并天然支持模块化、动态化与依赖注入范围控制。作为现代 Android 架构的关键锚点,Navigation 将页面流转关系升维为可版本管理、可自动化测试、可协作评审的‘唯一真相

weixin_30074763的博客 153
上一篇: 为什么Android应用程序会滞后?
下一篇: 使用调试日志在 Activity 和 View Model 中演示 Android 生命周期的简单应用
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值