前端生态里,我们早就有了一套应对多平台差异的方法论;而KotlinMultiplatform给出的答案,叫做expect/actual。...expect:声明公共契约expect只能放在commonMain(共享代码目录)。...这让你可以在类型安全的Kotlin代码里调用任意JS全局API。三种典型expect/actual场景场景一:平台标识最简单的场景——返回一个字符串标识当前平台。...实战:在ComposeUI中使用expect/actual共享UI代码完全不感知底层实现,直接调用expect函数即可:展开代码语言:KotlinAI代码解释//commonMain/kotlin/org...类级别的expect/actual会让代码导航复杂一些。
在 KMM 的帮助下,您可以在 iOS 和 Android 应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。...[项目结构.png] 三、使用expect/actual编写平台特定的代码 以打印日志为例,打造一个alog日志SDK 在commonMain定义IALog接口,声明fun v函数,其他函数忽略。...并定义expect ALogImpl类来实现平台特性打印日志 interface IALog { fun v(tag: String, message: String) ... } expect...String, message: String) ... } 在androidMain中用actual修饰来实现真正的接口,带actual修饰的方法为Android/iOS公共方法,不带actual...sdkframework.h头文件中,这样iosApp才可以使用这几个模块的类和方法。
KMP使用expect 和 actual 关键字 在 Kotlin Multiplatform 项目中,expect 和 actual 关键字被用于处理不同平台的 API 调用。...这种方式适用于管理平台特定的依赖。 5、 处理枚举类: 当使用 expect 关键字声明枚举类时,每个平台模块应该提供一个 actual 声明,包含相同的枚举值常数,也可以包含额外的枚举值常数。...通过这种方式,Kotlin Multiplatform 允许开发者编写可在多个平台上运行的共享代码,同时保留对每个平台特定 API 的访问能力,实现代码的最大化重用和原生性能的结合。...代码示例 以下是一个使用 expect 和 actual 关键字在 Kotlin Multiplatform 项目中处理不同平台 API 调用的代码示例: 共通代码 (commonMain): // 预期声明...同样,PlatformSpecificClass 类在两个平台上有不同的实现,但它们都有一个 doSomething() 方法,该方法返回一个特定于平台的字符串。
所以我们为什么不只写一次业务逻辑代码,在不同的平台上共享呢? 有了这个想法之后,Jetbrains 带来了 Kotlin Multiplatform Project 。...共享代码,使用 Kotlin 编写,使用 Kotlin/JVM 编译成 JVM 字节码,使用 Kotlin/Native 编译成二进制,所以你可以和使用其他一般类库一样使用 KMM 业务逻辑模块。...为了处理这种情况,Kotlin 提供了 expect/actual 机制。...为了完成这个功能,你需要使用 expect/actual 关键字。 首先,在 common 模块中使用 expect 关键字声明一个空的类或函数,就像创建接口或者抽象类一样。...然后,在所有的其他模块中编写平台特定代码来实现对应的类或函数,并用 actual 修饰。 注意,如果你使用了 expect,你必须提供对应名称的 actual 实现。
Kotlin Multiplatform 是一种跨所有这些平台共享非 GUI 代码的技术。...Kotlin Multiplatform 中的 Expect 和 Actual,解决了调用本机平台 API 的需求 本机 API 问题是通过预期声明和实际声明的机制来解决的。...expect 关键字将声明标记为将与用actual关键字标记的代码匹配,actual关键字可能是特定于平台的。...JetBrains 建议仅对平台 API 使用 expect/actual,其他情况使用普通接口。...去年,谷歌通过 引入 其他一些 Jetpack 库的“实验预览”,表达了对 Kotlin Multiplatform 的一些支持,这些库不是用于生产的,而是用于“在针对 Android 和 iOS 应用程序的多平台项目中使用这些
与 Flutter(Dart + 自绘引擎)、React Native(JS + 原生桥接)不同,Kuikly 选择了一条更激进的路线: 语言:Kotlin(KMP 多平台编译) 渲染:各平台原生渲染引擎...三、架构原理:KMP + 平台原生渲染 Kuikly 采用「Kotlin 多平台 + 平台原生渲染」的混合架构,分为五层: plaintext ┌────────────────────────────...→ 输出 .js └── nativeMain/ # iOS & HarmonyOS 共性代码 commonMain 通过 expect/actual 机制定义跨平台抽象,各平台 actual...生态:Android 开发者零门槛,可复用 Kotlin 协程、数据类等全部生态 真原生渲染:无自绘引擎,无 JS 桥接,各平台直接调用原生 API 鸿蒙一等公民:鸿蒙支持是正式稳定版本,非实验性功能...其核心价值在于: ✅ 真原生性能:各平台生成原生二进制,无虚拟机/JS 引擎开销 ✅ 90%+ 代码复用:commonMain 统一业务逻辑,expect/actual 隔离差异 ✅ 零初始化成本:KSP
二、Core 的设计选择Core 面对的核心问题是:怎么让尽可能多的逻辑跑在共享层,同时不依赖任何平台的 UI 类型。限制很清楚。共享层可以用 Kotlin 标准库,可以用协程,甚至可以做布局计算。...但共享层绝对不能碰 android.view.View 或 UIView,一旦依赖了具体平台的 UI 类,跨平台的前提就不存在了。...KuiklyUI 用 KMP 的 expect / actual 机制在共享和平台之间划界。这里有一个判断标准值得拆开看:什么算平台 UI 类型,什么不算。...expect/actual 意味着任何一种平台能力被新增到共享层,五个平台都要补一份 actual 实现,少一个就会让共享层的调用编译失败。...新增一个平台时,工作量集中在补 actual 而不是写业务代码。平台差异的 bug 也通常以 expect/actual 不匹配的形式暴露,定位时要逐平台对照检查。
最近我正在学习 Kotlin。它不仅在 Android 开发中举足轻重,还凭借多平台能力,在前端领域展现出巨大潜力。...集合操作与惰性序列 Kotlin 集合操作与 JS 数组方法(如map/filter)语法相似,但默认提供不可变集合(线程安全,推荐用于数据共享): val numbers = listOf(1, 2,...五、多平台开发 1....Kotlin Multiplatform 核心:共享逻辑,差异化实现 通过共享模块(commonMain)编写跨平台业务逻辑,各平台(jsMain/androidMain/iosMain)实现特定功能:...// 共享模块:定义平台无关的网络请求接口 expect interface NetworkClient { suspend fun get(url: String): String
KMP 的核心定位是:共享业务逻辑,UI 各平台自己来。 它的架构分层很清晰: 层次 Android iOS 共享?...(通过 KMP) ✅ 可以共享 业务逻辑 / 领域层 Kotlin 编写,完全共享 ✅ 完全共享 数据层(网络/本地存储) Ktor + SQLDelight 跨平台 ✅ 完全共享 换句话说,KMP...——expect/actual 机制 KMP 最核心的跨平台机制就是 expect/actual。...在 commonMain 里声明接口期望,各平台提供实现: // commonMain - Platform.kt expect class PlatformContextexpect fun getPlatformName.../Native 对多线程有一些限制(Frozen Objects 问题),虽然新版本有所改善,但如果你的共享代码涉及复杂并发逻辑,需要额外注意 • 三方库生态:不是所有 Android 常用库都有 KMP
一、问题背景:三端开发的真实痛点痛点传统方案Kuikly 方案代码重复Android/iOS/鸿蒙各写一遍90%+ 代码共享团队成本需要 Android + iOS + ArkTS 三支团队Kotlin...Kuikly 采用「Kotlin 多平台 + 平台原生渲染」混合架构,核心思路是:用 Kotlin 写业务逻辑,让各平台用自己的原生组件渲染。...││ expect/actual 机制 · Bridge 通信 │├────────────────...:expect/actual 机制kotlin// commonMain:声明跨平台抽象expect fun getPlatformName(): String// androidMain:Android...、UI 布局、数据模型全部放 commonMain平台隔离仅平台特有 API(相机、传感器等)放对应平台目录接口驱动平台差异通过 expect/actual 抽象,不在业务层感知模块化按功能拆分模块,通过
作者 / David Winer, Kotlin 产品经理 有时候一些可读性差、不够明确或者名字太长的类型声明会干扰代码的 "自我表达"。...在多平台工程中使用类型别名 在使用 Kotlin 开发多平台工程时,您可以在公共代码 (common code) 中写一个接口,并在相应的平台代码中实现这个接口。...Kotlin 提供了 "实际声明" (actual declarations) 和 "预期声明" (expected declarations) 的机制来简化这种操作。...在公共代码中声明的接口为预期声明,使用 expect 关键字;在相应的平台代码中的扩展为实际声明,使用 actual 关键字。...如果平台代码中已经实现了公共代码中的某个接口,并且所有期望方法的签名一致时,您可以使用类型别名将实际声明的类型名称映射到期望类型上: expect annotation class Test actual
KMM更像是营销术语,我们不用纠结Mobile这个词,你要知道的是,下文我们所说的KMM就是指的Kotlin跨平台不仅限于移动端就行了。 KMM可以简化多平台应用程序的开发。...expect与actual 我们要依赖Kotlin中的expect与actual关键字。expect是我们期望实现的方式,actual是实现方式,有点类似接口与实现类。...首先我们要在commonMain中使用expect定义这个接口 然后我们在shares模块下的androidMain、iOSMain目录下各自实现打开蓝牙的方法。...这样我们就确保多平台下使用同一API来调用,调用方不需要关注具体的实现。...中可以通过使用 UIKitView,在共享用户界面中嵌入复杂的特定于平台的小部件,如地图、 Web 视图、媒体播放器和照相机等。
Kotlin 怎么跨平台? Kotlin 1.2 的发布,带来了一个重量级特性,那就是跨平台。...当然,Kotlin 会对一些平台无关的语言层面的 Api 做封装,提供一个跨平台的标准库,所以大家在编写跨平台代码时需要依赖下面这个: dependencies { compile "org.jetbrains.kotlin...这需要用 expect 这个关键字在 Common Lib 当中声明这样一个 Date 类: expect class Date(){ fun getTime(): Long } 是不是有点儿像...= jvmDate.time } 与 expect 相对的有 actual,这就是在 Jvm 上面实现的版本了。...Js 版本的 Date: actual class Date { private val jsDate = kotlin.js.Date() actual fun getTime() =
作为一名前端开发工程师,在完成了 Kotlin 语言基础学习后,我开始探索 Kotlin 在跨平台开发中的实际应用。...Kotlin Multiplatform 是 JetBrains 开发的跨平台解决方案,允许在多个平台间共享代码:支持的平台Android:原生 Android 应用iOS:原生 iOS 应用 Web...:通过 Kotlin/JS 或 Kotlin/WasmDesktop:Windows、macOS、Linux 桌面应用Server:后端服务开发代码共享策略// 共享代码 (commonMain)expect...class Platform()expect fun getPlatform(): Platform// Android 实现 (androidMain)actual class Platform {...一套代码,三个平台将 Jetpack Compose 与 Kotlin Multiplatform 结合,可以实现:Android 原生应用:最佳性能和用户体验iOS 原生应用:原生性能和用户体验Web
:kotlin.native.cacheKind=none # 避免 iOS 编译缓存问题新建项目:使用 Kotlin Multiplatform Wizard 快速生成跨平台项目模板,勾选 Compose...项目结构典型的多平台项目结构:shared/ src/ commonMain/ # 公共代码(Compose UI、业务逻辑) androidMain/ # Android...编写共享 Compose UI在 shared/src/commonMain/kotlin 中创建跨平台组件:// 共享的 Compose 组件@Composablefun Greeting(name:...处理平台差异使用 expect/actual 机制实现平台特定逻辑:// 公共代码声明 expectexpect fun getPlatformName(): String// Android 实现actual...学习资源官方文档Compose Multiplatform 示例项目KMP 社区通过 Compose Multiplatform,开发者可以显著减少重复代码,但需注意平衡代码共享与平台体验。
要从通用模块中调用特定于平台的代码,可以指定所需的声明:所有特定于平台的模块需要提供实际实现声明。而在为特定平台编译多平台项目时,会生成通用及特定平台相关部分的代码。...可以通过 expected 以及 actual 声明来表达通用代码对平台特定部分的依赖关系。expected 声明指定了一个 API(类、接口、注释、顶层声明等)。...actual 声明或是 API 的平台相关实现,或是在外部库中 API 现有实现的别名引用。...,Kotlin 1.2添加了一些常见的数学运算API。...这可能会影响应用程序的整体性能;只有在多个类之间共享一些复杂的状态并在类初始化时更新时才使用它。
2、 多平台库:库作者可以创建包含公共代码及其针对JVM、Web和原生平台的平台特定实现的多平台库,发布后,这些库可以作为其他跨平台项目的依赖项 。...Kotlin Multiplatform的关键特性包括: 代码共享:在项目中使用的所有平台或部分平台之间共享公共代码。...如果需要访问特定平台的 API,使用 Kotlin 的 expect 和 actual 机制来实现 。...6、 创建 iOS 应用并集成共享模块:在 Xcode 中创建一个新的 iOS 项目,并将共享模块作为框架集成到 iOS 项目中。这可能需要一些配置,如设置框架搜索路径和链接器标志 。...7、 使用共享模块:在 iOS 应用中,通过 Swift 代码使用共享模块。您可以导入共享模块并调用其中定义的函数和类 。
一般开发中所接触到的协程类和接口无非是 launch, async, Dispatch.IO...,这些概念是对我们开发者来说的。进入协程源码的世界之后,这些概念就会被一些内部概念所替代。...Dispatcher的默认实现是一个 expect 类, public expect object Dispatchers { public val Default: CoroutineDispatcher...协程框架三大件,Continuation-Disptacher-Scheduler Kotlin的协程从框架设计上就考虑了跨平台的问题。 这里的跨平台不是指安卓和服务端。...而是指kotlin在支持 jvm / js/ native 三个平台上的跨平台。从它的设计上也能感受到kotlin想吊打其他语言的野心。...... } 可以看到jvm包中的方法名多了 actual修饰,后面也有具体的实现createDefaultDispatcher()。
这种爆发式增长源于三大核心优势:开发效率革命:通过空安全、扩展函数等特性,减少40%样板代码跨平台战略:支持JVM/JS/Native多平台编译,实现代码复用率提升65%生态协同效应:与Spring Boot...领域模型设计密封类(Sealed Class)在订单状态机实现中展现独特价值:编译期完备性检查:强制处理所有可能状态分支模式匹配优化:when表达式实现精准状态分发数据类继承:结合data class自动生成业务对象方法类型安全封装...多平台架构策略Kotlin Multiplatform Mobile(KMM)在物流追踪应用中的实践:业务逻辑共享:将定位算法、网络请求等核心代码复用平台适配层:通过expect/actual声明处理平台差异依赖注入...:使用Koin实现跨平台DI容器测试策略:共享单元测试,平台特定UI测试四、性能优化实战1....通过系统学习语言特性、掌握架构设计方法、熟练运用性能优化技巧,开发者将构建起坚实的技术护城河。
多平台 + 平台原生渲染」的混合架构:plaintext┌─────────────────────────────────────────────┐│ 业务代码层(commonMain...) ││ Kotlin 编写,跨平台共享 UI 逻辑 │├──────────────┬──────────────┬─────────────...(核心)│ └── src/│ ├── commonMain/ # 跨平台共享代码(UI + 逻辑)│ ├── androidMain/ # Android...5.2 平台差异实现(expect/actual 机制)当需要调用平台特有能力时,使用 Kotlin 的 expect/actual 机制:kotlin// commonMainexpect fun getPlatformName...API 调用androidMain/iosMain/ohosArm64Main通过 expect/actual 隔离原生能力扩展各平台壳工程封装为 Module 供 Kotlin 侧调用10.2 性能优化要点列表优化