内容简介:随着最近发布的Kotlin 1.3,我听说了创建多平台移动应用程序的能力现在可以在我的 android 和 ios 应用程序之间共享代码??? 这背后的魔力是什么?让我向你展示我如何成功创建我的第一个 Android 和 iOS 兼容模块,以及如何将其集成到实际应用程序中。
随着最近发布的Kotlin 1.3,我听说了创建多平台移动应用程序的能力
现在可以在我的 android 和 ios 应用程序之间共享代码??? 这背后的魔力是什么?
让我向你展示我如何成功创建我的第一个 Android 和 iOS 兼容模块,以及如何将其集成到实际应用程序中。
Kotlin 可以编译到任何平台
Kotlin 的最新版本强制执行多平台语言的概念,您已经可以使用 Kotlin 生成 JVM 二进制文件和 JS 包,现在可以生成 Native 框架!
对于原生我想说的是 iOS 代码,但不仅仅是!根据官方文档,可以生成与许多本机架构兼容的代码:
我将只关注 Kotlin-Native iOS 兼容性,并向你演示如何生成与 Android 和 iPhone 兼容的共享 kotlin 代码的移动应用程序!
我是如何创建我的多平台项目的
Mhhmmm让我猜想什么是完美的 IDE,兼容 Gradle 和 Android
当然 IntelliJIdea :grin:(你也可以使用 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 中编写代码 :
注入特定于平台的实现
你可以在公共模块内部进行接口,例如 PlatformLogger:
然后我在每个平台上创建了实现,这里是android app模块:
在我的 XCode 项目中,我创建了一个 PlatformLoggerIOS ,实现了 PlatformLogger 协议 :
我们可以直接从构造函数提供这些 PlatformLogger 作为 G ithubRepository 的依赖项。我用来创建一个名为 DependencyManager 的类,进行一些惰性初始化,存储在 Android 上的 Application 中,以及 iOS 上的 AppDelegate 中:
在我的代码中,我可以使用 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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
在线进制转换器
各进制数互转换器
图片转BASE64编码
在线图片转Base64编码工具