当前位置: 首页 > news >正文

compose navigation 自定义navtype

Jetpack compose navigation with custom NavType

https://www.youtube.com/watch?v=qBxaZ071N0c&t=182s

定义两个路由

@Serializable
data object DogListRoute@Serializable
data class DogDetailRoute(val dog: Dog,val breedSize: BreedSize
)

即两个页面,一个狗列表页面,点击列表项,进入狗详情界面。

大部分情况下,我们应该是传狗的ID,然后在狗详情界面,通过查询本地数据库or API,去获取狗详情信息。

但是这里演示一个自定义的数据类型,通过navtype来传递。

可以看到 DogDetailRoute带了两个参数,一个是自定义类型Dog。另一个是枚举类型 BreedSize

@Serializable
data class Dog(val id: Int,val name: String,
)enum class BreedSize {SMALL,MEDIUM,LARGE
}

序列化需要引入

plugin
jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }implementationkotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version = "1.6.3" }

通过自定义navtype可以方便的在导航过程中,传递自定义参数

                         composable<DogListRoute> {DogListScreen(onDogClick = { dog, breedSize ->navController.navigate(DogDetailRoute(dog = dog,breedSize = breedSize))})}composable<DogDetailRoute>(typeMap = mapOf(typeOf<Dog>() to CustomNavType.DogType,typeOf<BreedSize>() to NavType.EnumType(BreedSize::class.java))) {val arguments = it.toRoute<DogDetailRoute>()DogDetailScreen(dog = arguments.dog,breedSize = arguments.breedSize)}
navController.navigate 直接放入带自定义参数的 route,在接收端,通过 toRoute直接获取组装后的带自定义参数的route,但是前提条件是,需要注册号typeMap

 typeMap = mapOf(
                                typeOf<Dog>() to CustomNavType.DogType,
                                typeOf<BreedSize>() to NavType.EnumType(BreedSize::class.java)

通过CustomNavType.DogType告诉navigator怎么对dog进行转换

object CustomNavType {val DogType = object : NavType<Dog>(isNullableAllowed = false) {override fun get(bundle: Bundle, key: String): Dog? {return Json.decodeFromString(bundle.getString(key) ?: return null)}override fun parseValue(value: String): Dog {return Json.decodeFromString(Uri.decode(value))}override fun serializeAsValue(value: Dog): String {return Uri.encode(Json.encodeToString(value))}override fun put(bundle: Bundle, key: String, value: Dog) {bundle.putString(key, Json.encodeToString(value))}}
}

其中 使用URI编码主要用于将URI中的特殊字符转化为一种通用的格式

http://www.lryc.cn/news/463898.html

相关文章:

  • 实现对redis过期键监听案例
  • yocto基础 -- bb 文件字段解析
  • Android开发相关的重要网站
  • MySQL 中utfmb3和utfmb4字符集区别
  • 【C语言】文件操作(1)(文件打开关闭和顺序读写函数的万字笔记)
  • 今日总结10.18
  • React Agent 自定义实现
  • RabbitMQ 入门(六)SpringAMQP五种消息类型(Direct Exchange)
  • 2062:【例1.3】电影票
  • Python | Leetcode Python题解之第477题汉明距离总和
  • Leecode刷题之路第25天之K个一组翻转链表
  • nuxtjs3 使用tailwindcss做自适应
  • 数据资产目录构建方法与应用
  • 【Python爬虫实战】从文件到数据库:全面掌握Python爬虫数据存储技巧
  • 断其一指,无惧!ProFusion3D: 相机或者激光失效仍高效的多传感器融合3D目标检测算法
  • CCS字体、字号更改+CCS下载官方链接
  • YOLO11改进|注意力机制篇|引入SEAM注意力机制
  • 简历修订与求职经历 - Chap04
  • 鸿蒙开发案例:推箱子
  • mysql--表的约束
  • Ubuntu 上安装 docker 并配置 Docker Compose 详细步骤
  • MySQL去除空白字符(如非标准空格、制表符等)
  • 2063:【例1.4】牛吃牧草
  • QT开发:深入掌握 QtGui 和 QtWidgets 布局管理:QVBoxLayout、QHBoxLayout 和 QGridLayout 的高级应用
  • Bootstrapping、Bagging 和 Boosting
  • 板块龙头公司
  • Java项目-基于Springboot的招生管理系统项目(源码+说明).zip
  • 使用 MongoDB 构建 AI:利用实时客户数据优化产品生命周期
  • 【React】React18核心源码解读
  • 部署私有仓库以及docker web ui应用