[译]我第一次体验Kotlin Native

翻译说明:

原标题: My first experience with Kotlin Native

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

原文做者: florent champigny

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

如今能够在个人 android 和 ios 应用程序之间共享代码??? 这背后的魔力是什么?android

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

Kotlin 能够编译到任何平台

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

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

Kotlin-Native目标平台

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

我是如何建立个人多平台项目的

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

固然 IntelliJIdea 😁(你也可使用 Android Studio)api

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

你也能够按照官方文档从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中文社区

相关文章
相关标签/搜索