多平台编程

多平台项目是 Kotlin 1.2 和 1.3 中的实验性特性。本文档中描述的所有语言和工具功能都可能在将来的Kotlin版本中发生变更

使 Kotlin 可以在所有平台上使用是我们的目标,但我们认为这是一个更为重要的目标的前提:在平台之间共享代码。 借助对JVM,Android,JavaScript,iOS,Linux,Windows,Mac甚至STM32等嵌入式系统的支持,Kotlin可以处理现代应用程序的任何和所有组件。这为代码和知识经验重用带来了极大便利, 节省了大量用于多平台而需要两次或多次实现的时间,从而可以把时间用在更具挑战性的任务上。

它是怎么工作的

首先,多平台不是编译代码到所有平台。这种模型有着显而易见的缺点,我们都知道现代应用往往需要调用它们运行所在平台的独有特性。Kotlin不会限制你使用世界上所有API的共同子集。每个组件都可以尽可能的共享代码,同时可以借助语言提供的 [预期/实际(expect/actual) 机制]{https://kotlinlang.org/docs/reference/platform-specific-declarations.html}调用平台相关代码。

下面是一段示例代码,一个简单的日志记录框架,可以共享和互相调用公共逻辑和平台逻辑。公共代码如下:

  1. enum class LogLevel {
  2. DEBUG, WARN, ERROR
  3. }
  4. // 预期用于平台特有的API
  5. internal expect fun writeLogMessage(message: String, logLevel: LogLevel)
  6. // 预期通用代码API
  7. fun logDebug(message: String) = writeLogMessage(message, LogLevel.DEBUG)
  8. fun logWarn(message: String) = writeLogMessage(message, LogLevel.WARN)
  9. fun logError(message: String) = writeLogMessage(message, LogLevel.ERROR)

它预期目标为 writeLogMessage 提供特定于平台的实现,并且通用代码现在可以使用此声明,而无需考虑如何实现。

在JVM上,可以提供一种将日志写入标准输出的实现:

  1. internal actual fun writeLogMessage(message: String, logLevel: LogLevel) {
  2. println("[$logLevel]: $message")
  3. }

在 JavaScript 中,有着完全不同的API集合,所以也可以这样实现:

  1. internal actual fun writeLogMessage(message: String, logLevel: LogLevel) {
  2. when (logLevel) {
  3. LogLevel.DEBUG -> console.log(message)
  4. LogLevel.WARN -> console.warn(message)
  5. LogLevel.ERROR -> console.error(message)
  6. }
  7. }

在 1.3 中,我们重新设计了整个多平台模型。我们用于描述多平台Gradle项目的新DSL更加灵活,并将持续致力于提供简单明了的配置。

多平台库

通用代码可以依靠一组涵盖日常任务(例如HTTP,序列化和管理协程)的库。 此外,所有平台上都提供了广泛的标准库。

你也可以编写自己的库,以提供通用的API,并在每个平台上以不同的方式实现它。

使用场景

Android - iOS

在移动平台中共享代码是 Kotlin 多平台的主要使用场景,如今可以在 Android 和 iOS 中共享业务逻辑,网络链接等部分的代码。

参看:

移动多平台的特性,场景学习以及示例代码

新建一个移动多平台项目

Client - Server

另一个场景就是在浏览器中共享客户端和服务端共享代码逻辑,Kotlin 多平台也支持这种场景。

Ktor框架 适合在连接的系统中构建异步服务器和客户端。

怎么开始

刚开始学 Kotlin ? 可以去开始页面。

建议的文档页面:

推荐教程:

示例项目:

所有例子都可以在 Github 上找到