Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用

简介: 本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

KMP使用expectactual 关键字

在 Kotlin Multiplatform 项目中,expectactual 关键字被用于处理不同平台的 API 调用。以下是如何使用这些关键字的详细步骤和规则:

1、 定义预期声明(Expected Declarations)
在共通代码集中(例如 commonMain),使用 expect 关键字声明一个结构,这可以是函数、属性、类、接口、枚举或注解。这些预期声明不包含实现代码,而是作为平台无关的 API 供共通代码使用。

2、 提供实际声明(Actual Declarations)
在每个平台特定的源代码集中(例如 androidMainiosMain),声明与预期声明相同的结构,并使用 actual 关键字标记。这些实际声明通常包含使用特定平台库的实现。

3、 编译器匹配
编译特定目标平台时,编译器会尝试匹配共通代码集中的每个 expect 声明与平台特定源代码集中的相应 actual 声明。编译器确保:

  • 每个 expect 声明在每个平台特定源代码集中都有匹配的 actual 声明。
  • expect 声明不包含实现。
  • 每个 actual 声明与对应的 expect 声明使用相同的包名。

4、 使用依赖注入(Dependency Injection, DI)
在采用 DI 框架的项目中,可以在共通代码中使用 expect 声明接口,然后通过 DI 框架配置,为不同平台注入 actual 实现。这种方式适用于管理平台特定的依赖。

5、 处理枚举类
当使用 expect 关键字声明枚举类时,每个平台模块应该提供一个 actual 声明,包含相同的枚举值常数,也可以包含额外的枚举值常数。这允许在共通代码中声明枚举,而在平台特定代码中扩展它。

6、 类型别名
如果需要使用特定平台的现有类型实现预期声明,可以使用类型别名(typealias)来连接预期声明和平台特定的类型。这在无法直接向平台类型添加 actual 关键字时非常有用。

7、 扩展可见性
实际实现的可见度可以超过对应的预期声明。这在不希望将 API 公开给所有用户时非常有用。从 Kotlin 2.0 开始,编译器不再限制可见性的变化。

通过这种方式,Kotlin Multiplatform 允许开发者编写可在多个平台上运行的共享代码,同时保留对每个平台特定 API 的访问能力,实现代码的最大化重用和原生性能的结合。

代码示例

以下是一个使用 expectactual 关键字在 Kotlin Multiplatform 项目中处理不同平台 API 调用的代码示例:

共通代码 (commonMain):

// 预期声明:在共通代码中声明一个函数,但不提供实现。
expect fun getPlatformName(): String
expect class PlatformSpecificClass {
    fun doSomething(): String
}
AI 代码解读

Android 平台代码 (androidMain):

// 实际声明:为 Android 平台提供 getPlatformName() 函数的具体实现。
actual fun getPlatformName(): String = "Android"

// 实际声明:为 Android 平台提供 PlatformSpecificClass 类的具体实现。
actual class PlatformSpecificClass actual constructor() {
    actual fun doSomething(): String = "Doing something on Android"
}
AI 代码解读

iOS 平台代码 (iosMain):

// 实际声明:为 iOS 平台提供 getPlatformName() 函数的具体实现。
actual fun getPlatformName(): String = "iOS"

// 实际声明:为 iOS 平台提供 PlatformSpecificClass 类的具体实现。
actual class PlatformSpecificClass actual constructor() {
    actual fun doSomething(): String = "Doing something on iOS"
}
AI 代码解读

在这个示例中,我们定义了两个预期声明:一个函数 getPlatformName() 和一个类 PlatformSpecificClass。这些预期声明在共通代码中声明,但它们的实现被留给了特定平台的代码。

对于每个平台,我们提供了相应的实际声明。例如,getPlatformName() 函数在 Android 上返回字符串 "Android",而在 iOS 上返回 "iOS"。同样,PlatformSpecificClass 类在两个平台上有不同的实现,但它们都有一个 doSomething() 方法,该方法返回一个特定于平台的字符串。

这样,当您在共通代码中调用 getPlatformName() 或创建 PlatformSpecificClass 的实例时,Kotlin 编译器会自动选择并使用适当平台的实际实现。这使得您可以在不同的平台上重用共通逻辑,同时保持对平台特定功能的访问。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
打赏
0
0
0
0
148
分享
相关文章
1688商品数据实战:API搜索接口开发与供应链分析应用
本文详细介绍了如何通过1688开放API实现商品数据的获取与应用,涵盖接入准备、签名流程、数据解析存储及商业化场景。开发者可完成智能选品、价格监控和供应商评级等功能,同时提供代码示例与问题解决方案,确保法律合规与数据安全。适合企业开发者快速构建供应链管理系统。
【重磅发布】 免费领取阿里云百炼AI大模型100万Tokens教程出炉,API接口实战操作,DeepSeek-R1满血版即刻体验!
阿里云百炼是一站式大模型开发及应用构建平台,支持开发者和业务人员轻松设计、构建大模型应用。通过简单操作,用户可在5分钟内开发出大模型应用或在几小时内训练专属模型,专注于创新。
781 89
【重磅发布】 免费领取阿里云百炼AI大模型100万Tokens教程出炉,API接口实战操作,DeepSeek-R1满血版即刻体验!
Android平台GB28181执法记录仪技术方案与实现
本文介绍了大牛直播SDK的SmartGBD在执法记录仪场景中的应用。GB28181协议作为视频监控联网的国家标准,为设备互联互通提供规范。SmartGBD专为Android平台设计,支持音视频采集、编码与传输,具备自适应算法和多功能扩展优势。文章分析了执法记录仪的需求,如实时音视频传输、设备管理及数据安全,并详细阐述了基于SmartGBD的技术实现方案,包括环境准备、SDK集成、设备注册、音视频处理及功能扩展等步骤。最后展望了SmartGBD在未来智慧物联领域的广阔应用前景。
48 13
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
81 11
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
99 19
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)
本文分享鸿蒙相机开发经验,从环境准备到核心逻辑实现,涵盖权限声明、模块导入、Surface关联与分辨率匹配,再到录制控制及设备适配法则。通过实战案例解析,如旋转补偿、动态帧率调节和编解码优化,帮助开发者掌握功能实现、设备适配与体验设计三大要点,减少开发坑点。适合鸿蒙新手及希望深化硬件交互能力的工程师参考收藏。
56 2
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
1688平台API接口实战:Python实现店铺全量商品数据抓取
本文介绍如何使用Python通过1688开放平台的API接口自动化抓取店铺所有商品数据。首先,开发者需在1688开放平台完成注册并获取App Key和App Secret,申请“商品信息查询”权限。接着,利用`alibaba.trade.product.search4trade`接口,构建请求参数、生成MD5签名,并通过分页机制获取全量商品数据。文中详细解析了响应结构、存储优化及常见问题处理方法,还提供了竞品监控、库存预警等应用场景示例和完整代码。
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。

热门文章

最新文章