news 2026/4/18 12:39:55

Multiplatform - 使用 Jetpack 组件(ViewModel、Navigation3)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Multiplatform - 使用 Jetpack 组件(ViewModel、Navigation3)

一、概念

二、ViewModel

2.1 添加依赖

[versions] viewModel = "2.9.6" [libraries] jetbrains-viewModel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "viewModel" } //可选(解决桌面端对于默认调度器 Dispatchers.Main.immediate 可能不可用) kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }

2.2 使用

在非 JVM 平台上,无法通过类型反射实例化对象。因此在公共代码中,不能直接调用无参数的 viewModel() 函数,每次创建 ViewModel 实例时,至少需提供一个初始化器作为参数。

若仅提供初始化器,库会在底层创建默认工厂。但您也可以实现自己的工厂,并调用公共 viewModel(...) 函数中更显式的重载版本,这与 Jetpack Compose 中的使用方式一致。

@Composable fun Demo( viewModel: MyViewModel = viewModel { MyViewModel() } ) {...}

三、Navigation3

3.1 添加依赖

[versions] navigation3 = "1.0.0-alpha06" navigation3ViewModel = "2.10.0-alpha08" navigation3Adaptive = "1.3.0-alpha04" navigation3Browser = "0.2.0" [libraries] jetbrains-navigation3-ui = { module = "org.jetbrains.androidx.navigation3:navigation3-ui", version.ref = "navigation3" } jetbrains-navigation3-viewModel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "navigation3ViewModel" } //可选(自适应布局) jetbrains-navigation3-adaptive = { module = "org.jetbrains.compose.material3.adaptive:adaptive-navigation3", version.ref = "navigation3Adaptive" } //可选(回退支持web浏览器历史) jetbrains-navigation3-browser = { module = "com.github.terrakok:navigation3-browser", version.ref = "compose-multiplatform-navigation3-browser" }

3.2 使用

@Serializable private data object RouteA : NavKey @Serializable private data class RouteB(val id: String) : NavKey // Creates the required serializing configuration for open polymorphism private val config = SavedStateConfiguration { serializersModule = SerializersModule { polymorphic(NavKey::class) { subclass(RouteA::class, RouteA.serializer()) subclass(RouteB::class, RouteB.serializer()) } } } @Composable fun BasicDslActivity() { // Consumes the serializing configuration val backStack = rememberNavBackStack(config, RouteA) NavDisplay( backStack = backStack, //... ) }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 11:04:45

uni-app——uni-app小程序附件上传的文件类型限制问题

小程序附件上传的文件类型限制问题 问题背景 在小程序开发中,"附件上传"是常见功能。但很多开发者在实现时会遇到一个问题:用户只能选择图片,无法选择PDF、Word等其他类型的文件。 最近在开发审批功能时就遇到了这个问题&#x…

作者头像 李华
网站建设 2026/4/18 4:00:01

从冷启动到爆品:AliBoost 如何破解推荐系统“富者愈富”困局

在大规模推荐系统中,如何让新商品、新内容获得公平成长机会,始终是一项核心挑战。 现实中,大多数平台采用“自然推荐 用户行为反馈”的机制:系统根据历史点击、转化等信号,不断强化对高表现商品的推荐权重。然而&…

作者头像 李华
网站建设 2026/4/18 10:50:16

MyBatis体系结构与工作原理 下篇

能力有限,只能粗看核心处理层ORM反射模块如何看public class Reflector {}每一个Reflector对应一个java类简化反射操作ReflectorFactory-创建ReflectorReflector 缓存测试反射的invokermetaclass争对复杂表达式操作metaObject争对对象表达式解析操作从mybatis角度看…

作者头像 李华
网站建设 2026/4/18 10:07:48

LeetCode热题100--136. 只出现一次的数字--简单

题目 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入&…

作者头像 李华
网站建设 2026/4/18 8:07:55

“死了么” 改名,申请注册商标注意避开负面词!

近日,在互联网引起网友热议的APP“死了么” 发布消息,称“死了么”将改名“Demumu”,这个应用的核心功能是,用户每日签到,若连续2日未签到则系统次日向紧急联系人发送邮件提醒,普推知产商标老杨认为这个改名…

作者头像 李华