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
}

Android 平台代码 (androidMain):

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

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

iOS 平台代码 (iosMain):

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

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

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

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

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


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

目录
相关文章
|
16天前
|
安全 数据挖掘 API
车辆车型大全 API 实战指南:推动交通行业智能化
车辆车型大全API由探数平台提供,旨在解决企业班车、物流运输及汽车销售等行业对标准化车型数据的需求。传统人工维护车型库效率低且易出错,而该API覆盖主流品牌与车系,包含品牌、车系、销售车型及配置参数等详细信息,适用于车队管理、电商平台及汽车资讯平台。API提供四个子接口:获取品牌、车系、销售车型与配置详情信息,支持高效查询。通过HTTP POST请求即可调用,返回结构化数据,助力企业实现智能化运营与科学决策,在绿色智能交通时代发挥重要作用。
70 4
|
1月前
|
JSON 算法 API
1688商品详情API实战:Python调用全流程与数据解析技巧
本文介绍了1688电商平台的商品详情API接口,助力电商从业者高效获取商品信息。接口可返回商品基础属性、价格体系、库存状态、图片描述及商家详情等多维度数据,支持全球化语言设置。通过Python示例代码展示了如何调用该接口,帮助用户快速上手,适用于选品分析、市场研究等场景。
|
29天前
|
监控 供应链 数据挖掘
淘宝商品详情API接口解析与 Python 实战指南
淘宝商品详情API接口是淘宝开放平台提供的编程工具,支持开发者获取商品详细信息,包括基础属性、价格、库存、销售策略及卖家信息等。适用于电商数据分析、竞品分析与价格策略优化等场景。接口功能涵盖商品基础信息、详情描述、图片视频资源、SKU属性及评价统计的查询。通过构造请求URL和签名,可便捷调用数据。典型应用场景包括电商比价工具、商品数据分析平台、供应链管理及营销活动监控等,助力高效运营与决策。
155 26
|
11天前
|
新能源 API 开发者
车辆限行查询API的实战指南:让限行管理从此 “有码可循”
随着全国机动车保有量突破4.53亿辆,交通拥堵与污染问题日益严峻,各城市陆续实施限行政策。探数API推出的车辆限行查询服务覆盖200+城市,提供实时限行数据,包括本地/外地燃油车及新能源车的限行规则、区域和时间等信息。其功能涵盖单个城市限行政策查询与支持城市的全面列表,助力用户精准规划出行。通过HTTP POST请求即可轻松接入,适用于导航平台和个人开发者。在“双碳”目标下,该API推动绿色出行与智能交通发展,为个人、企业和城市治理提供高效解决方案。
62 4
|
11天前
|
传感器 人工智能 安全
运营商三要素API的实战指南:实现 “人 - 证 - 号” 三位一体核验
在数字身份欺诈频发的背景下,传统单点验证已无法满足高安全需求。探数API推出的“运营商三要素核验API”,通过姓名、身份证号、手机号的三重交叉验证,构建起“铁三角”防线,广泛适用于金融、政务、电商等领域。该API支持一致性验证及基础信息返回(可选),具备高准确性与防伪性,远超单一或双因素验证方式。其调用流程简单,提供Python示例代码及异常处理建议,助力打造更安全的数字身份体系,成为连接多领域的关键桥梁。未来,多因子融合的身份认证将成为趋势,而三要素核验API正是当前可信数字身份的重要基石。
66 2
|
12天前
|
安全 物联网 API
核验身份证的一致性API的实战指南
随着网络空间安全问题日益突出,实名制成为保障安全与秩序的重要手段。探数API的身份证实名认证工具通过姓名和身份证号核验用户身份真实性,并返回扩展信息,广泛应用于各行业。本文介绍了其实现功能、调用流程及代码示例,同时解答了关于个人信息安全等常见疑问。接入该API不仅满足合规要求,更能提升用户信任,降低运营风险,共同构建安全高效的数字未来。
57 1
|
18天前
|
人工智能 JSON 安全
VIN码查询_标准版API:帮助解锁车辆的“身份证”详细信息的实战指南
VIN码(车辆识别号码)是由17位字母和数字组成的全球唯一编码,相当于汽车的“身份证”。通过解析VIN码,可获取品牌、车系、生产年份等关键信息。探数API平台的VIN码查询API(标准版),只需输入VIN码即可返回完整车辆配置信息。 该API适用于多种场景:电商平台可自动填充商品详情,提升准确性;维修行业能精准匹配零件与诊断需求;二手车市场则增强交易透明度与安全性。其调用流程简单,包括准备VIN码、构造请求、处理响应及异常处理。 VIN码不仅是查询工具,更是连接制造、销售、维修、保险等环节的纽带。
65 6
|
16天前
|
JSON 供应链 API
商品条码查询 API 实战指南:掌握商品“唯一身份标识”
商品条码查询API简介:基于1974年诞生的条码技术,该API通过输入13/14位条码,快速获取商品基本信息(名称、品牌、规格等)和成分信息(营养成分、配料表等)。其核心功能包括商品条码查询接口与成分查询接口,广泛应用于零售、电商、物流及健康饮食等领域。支持HTTP POST请求,提供便捷的代码调用示例。作为数字化转型的重要工具,它不仅方便消费者查询商品详情,还助力商家优化库存管理与销售流程,提升运营效率。
148 3
|
13天前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
40 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
19天前
|
Android开发 开发者
Android企业级实战-界面篇-3
本文是《Android企业级实战-界面篇》系列的第三篇,主要介绍分割线和条形跳转框的实现方法,二者常用于设置和个人中心界面。文章通过具体代码示例展示了如何实现这两种UI组件,并提供了效果图。实现前需准备`dimens.xml`、`ids.xml`、`colors.xml`等文件,部分资源可参考系列第一、二篇文章。代码中详细说明了布局文件的配置,如分割线的样式定义和条形跳转框的组件组合,帮助开发者快速上手并应用于实际项目中。

热门文章

最新文章

下一篇
oss创建bucket