[译]我第一次体验Kotlin Native

5,157 阅读5分钟

翻译说明:

原标题: My first experience with Kotlin Native

原文地址: medium.com/@champigny.

原文作者: florent champigny

随着最近发布的Kotlin 1.3,我听说了创建多平台移动应用程序的能力🤔

现在可以在我的 android 和 ios 应用程序之间共享代码??? 这背后的魔力是什么?

让我向你展示我如何成功创建我的第一个 Android 和 iOS 兼容模块,以及如何将其集成到实际应用程序中。

Kotlin 可以编译到任何平台

Kotlin 的最新版本强制执行多平台语言的概念,您已经可以使用 Kotlin 生成 JVM 二进制文件和 JS 包,现在可以生成 Native 框架!

对于原生我想说的是 iOS 代码,但不仅仅是!根据官方文档,可以生成与许多本机架构兼容的代码:

Kotlin-Native目标平台

我将只关注 Kotlin-Native iOS 兼容性,并向你演示如何生成与 Android 和 iPhone 兼容的共享 kotlin 代码的移动应用程序!

我是如何创建我的多平台项目的

Mhhmmm让我猜想什么是完美的 IDE,兼容 Gradle 和 Android 🤔

当然 IntelliJIdea 😁(你也可以使用 Android Studio)

为了创建我的项目,我复制了由 JetBrain 制作的官方 Kotlin-Conf 应用程序 的分支,并修改了源代码!

你也可以按照官方文档从0开始配置多平台项目

这是我制作的简单应用程序,你写了一个 github 用户的登录名,它显示了他的完整名字,它的头像和他的公司。它不是一个复杂的应用程序,但它包含一些 Http 调用,一个 Json 反序列化,并且可以使用 MVP 进行架构

多平台项目如何?

这个多平台项目由3个模块组成:

  • common :包含 kotlin 共同代码
  • android :包含 android 应用程序
  • appios :包含 xcode 项目

你可以直接从这些模块或公共模块的内部定义特定于平台的实现:这里 iosMain & jvmMain

生成 .frameworks

Kotlin 本地使用 Konan(一种LLVM编译器)从我们的通用模块生成 .framework。对于 Android 开发人员:.framework相当于 .jar

必须在你的 XCode 项目中导入此框架:

了解 Kotlin 类型

Kotlin 最初是为了生成 JVM 字节码而创建的。

但是只使用 Kotlin 类:Int,Double,List,Map 等,现在可以将这些对象与平台实现绑定。

你可以看到当前实现看你的所产生的 .h .framework,使用该通用类:

它将在 common.h 文件中生成这种代码:

我可以将常用模块放入什么?

响应很简单:几乎所有不依赖于UI或平台的东西!

我正在为我的项目开发 MVP,我在我的公共模块中添加了 Presenter,它的视图,存储库,api 和模型:

通用模块的内容

通用模块层次结构

这里唯一的平台特定层是 API,让我向您解释根据平台获得不同代码的不同方法:

特定于平台的库实施

在 Android 上的产品风格中使用相同的逻辑:所有风格应该公开相同的公共类(如果它们被我们的项目使用),你可以指定特定的 Gradle 依赖项,这里是我的 GithubAPI 中使用的 HTTP Ktor 库

从我的 GithubApi,我可以使用 HttpClient 类,它在 Android 和 iO 上有不同的实现

注意,你可以使用 kotlin 协同程序在我们的通用模块中执行异步方法!

使用 Ktor,我使用 kotlinx-serialization lib 将 json 解码为模型

用 Kotlin 写 iPhone 代码

Kotlin-Native 允许你将通用代码编译到框架,将类型绑定到平台类型,但它也允许你直接在 Kotlin 中编写 iPhone 代码!

我不是鼓励你在 Kotlin 中创建所有的 iOS 类,但是你可以直接在 Kotlin 中编写一些特定于平台的版本,让我给你看一个例子,如果我在公共模块中创建一个接口,用于简单的存储:

界面设置 - 常见

您可以直接在生成的 .framework 中提供其 iOS 实现,只需在 iosMain 模块中创建一个文件,然后使用 ios 类在 Kotlin 中编写代码 :

设置的实现 - iOS

注入特定于平台的实现

你可以在公共模块内部进行接口,例如 PlatformLogger:

然后我在每个平台上创建了实现,这里是android app模块:

在我的 XCode 项目中,我创建了一个 PlatformLoggerIOS,实现了 PlatformLogger 协议 :

我们可以直接从构造函数提供这些 PlatformLogger 作为 G ithubRepository 的依赖项。我用来创建一个名为 DependencyManager 的类,进行一些惰性初始化,存储在 Android 上的 Application 中,以及 iOS 上的 AppDelegate 中:

依赖管理器 - iOS

DependencyManager - Android

在我的代码中,我可以使用 GithubPresenter!

创建 Android 应用程序

我只需要创建一个片段及其布局,使用我的 DependencyManager 我可以检索我的 GithubPresenter,然后收听 EditText 的内容以下载并显示 github 用户。

最后,创建我的 XCode 应用程序

使用 storyboard 和一个简单的 ViewController,我实现了我的 GithubPresenter 的视图 :

这里我的 GithubController 实现了 GithubView,并通过我的 DependencyManager 检索 presenter

我可以使用我的演示者从我的 TextField 的内容下载 github 用户,然后轻松地显示它

我对 Kotlin-Native 的看法

对于 kotlin 原生的未来,你能想象到的是惊人的!

想象一下,当我们使用的所有库都将在 core/jvm/ios 中实现时,我们可以在这个框架中编写所有架构代码,并且只在每个平台上开发 UI!

今天,创建一个多平台应用程序并不是一件容易的事,智能的自动完成是危险的,你在编译代码时遇到一些随机问题,你不能轻易地在你的共同代码中附加一个调试器。一些 kotlin 代码在 swift 中没有它们的等价物,例如我没有成功为我的记录器创建一个伴随对象(我试图从Jake Wharton 重现像Timber这样的概念)

但不要忘记这是一项非常年轻的技术!几个月前不可能!

我不耐烦地了解 Kotlin-Native,并创建一些与 Android 和 iPhone 兼容的新库

我再次给你我的 android/ios 应用程序的代码,不要犹豫,给我发一些评论!我的 GitHub

欢迎关注 Kotlin 中文社区!

中文官网:www.kotlincn.net/

中文官方博客:www.kotliner.cn/

公众号:Kotlin

知乎专栏:Kotlin

CSDN:Kotlin中文社区

掘金:Kotlin中文社区

简书:Kotlin中文社区