首页 安卓& Kotlin Books Kotlin学徒

26
Kotlin Multiplatform. 由Victoria Gonda撰写

截至2019年,Kotlin是用于Android开发的首选语言。在iOS上,Swift语言已更换Object-C作为事实上的开发语言。

Swift和Kotlin具有多种相似之处,包括静态键入,型式安全,对功能和OOP范例的支持,以及零值的安全处理。语言也在句子上非常相似。

Kotlin / Native的出现开辟了将Kotlin代码集成到iOS项目中的可能性。事实上, Kotlin Multiplatform.(KMP) 方法开始作为iOS,Android,超越的跨平台工具集。

在本章中,您将使用 安卓StudioXcode. 创建KMP项目。

笔记:因为KMP也可以与JavaScript一起使用,在文档中,您也可能看到参考 kmm. 扫须是Kotlin Multiplatform Mobile,KPM专门用于Android和iOS。

KMP方法

IOS和Android上的典型应用程序从Internet下拉数据,将数据解析为应用程序代码中的对象,并在数据库中本地缓存某些网络数据。

对于iOS,您可能会使用库 alamofire. 用于网络和类似的东西 JSonserialization. 从网络解析接收的数据项对象。你会 核心数据 要在数据库中本地存储数据。

您可以实现像架构模式 MVVM 到您的结构应用程序代码。您可以使用库 伦威特 使您的代码更具声明性。您可以测试应用程序的视图模型和应用程序的其他部分。您可以显示A中的数据列表 UITATYVIEW. 在一个 UIViewController..

在Android上,您可以拥有所有代码的ANGS。你可能会使用 改造 对于网络, g 或者 moshi. 解析json, 房间 用于将数据存储在数据库中,像这样的模式 MVP. 或者 MVVM 对于架构,也许使用 rxjava. 在应用程序中。你重复类似的测试。并且您将显示列表数据 recyclerview. 在A. 活动 或者 分段 using an adapter.

即使是一个简单的应用程序也是很多复制。想象一下,您的应用程序中有许多屏幕,具有更多的数据,网络调用和远程数据的本地缓存,因为将有一个全功能的应用程序。代码重复的数量将与应用程序的大小基本上线性生长,因为首先生产的时间和精力量,然后维护两个平台的两个应用程序。

其他跨平台框架

减少针对IOS和Android的重复,长期以来一直是移动世界中许多开发人员和组织的愿景。早期尝试包括Web框架,如 PhoneGap..

分享代码

使用Kotlin Multiplatform,通过将所有前端应用程序的代码置于一个模块或共享项目,减少代码复制。这包括业务逻辑,以及网络代码,数据解析,数据持久性等内容。

hellokmp.

你要建立一个名为的简单应用程序 hellokmp. 在iOS和Android应用程序之间共享Kotlin代码。您将从Android Studio开始,并首先设置Android应用程序项目和项目级别为整个KMP项目的构建文件。

重命名app文件夹

Android的名称 应用程序 文件夹是理想的事情 Androidapp. 而不是默认 应用程序,以区分该部分项目是Android应用程序。

共享项目

您将更多地通过手工建立共享项目。这样,您将看到所有内容创建共享项目。

mkdir -p shared/src/androidMain/kotlin
mkdir -p shared/src/commonMain/kotlin
mkdir -p shared/src/iosMain/kotlin
touch shared/src/commonMain/kotlin/common.kt
touch shared/src/androidMain/kotlin/android.kt
touch shared/src/iosMain/kotlin/ios.kt
touch 共享/ build.gradle.kts.

配置您的环境

要使用Kotlin Multiplatform项目在Android Studio中,您需要下载Kotlin Multiplatform Mobile插件。打开 首选项‣插件‣市场 并搜索 Kotlin Multiplatform. Mobile.

共享代码构建文件

共享代码将变成a 使用Android应用程序和iOS运行的文件 框架 与iOS应用程序一起运行。共享项目 build.gradle.kts. 文件是一个kotlin文件,您将指定它的完成方式。

include ':shared'
plugins {
  kotlin("multiplatform")
  id("com.android.library")
}
kotlin {

}
和roid()
ios {
  binaries {
    framework {
      baseName = "shared"
    }
  }
}
sourceSets {
  val commonMain by getting
  val androidMain by getting {
    dependencies {
      implementation("com.google.android.material:material:1.2.1")
    }
  }
  val iosMain by getting
}

期待和实际

编译所有平台的整个共享项目不是Kotlin Multiplatform采取的方法。相反,一定数量的代码对所有平台都是常见的,但是每个平台的某些共享代码都是唯一的。 Kotlin包括这一点 期待/实际 允许这个的机制。

package com.raywenderlich

expect fun platformName(): String
class Greeting {
  fun greeting(): String = "Hello, ${platformName()}"
}
package com.raywenderlich

actual fun platformName(): String {
  return "Android"
}
package com.raywenderlich

import platform.UIKit.UIDevice

actual fun platformName(): String {
  return "${UIDevice.currentDevice.systemName()}"
}

建立你的项目

融合建筑需要两件小事:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.raywenderlich">

</manifest>
和roid {
  compileSdkVersion(29)
  sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
  defaultConfig {
    minSdkVersion(21)
    targetSdkVersion(29)
  }
}

来自Android的共享代码

现在是时候从Android应用程序那里获得了这么多的。

packagingOptions {
  exclude 'META-INF/*.kotlin_module'
}
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':shared')
和roid:id="@+id/greeting"
findViewById<TextView>(R.id.greeting).text =
  Greeting().greeting()
import android.widget.TextView
import com.raywenderlich.Greeting

iOS应用程序

在Android应用程序中使用了共享项目,您现在可以在iOS应用程序中使用共享代码。但首先,您需要设置iOS应用程序项目本身。

mkdir iosApp

包装iOS框架

接下来,返回Android Studio,您需要将任务添加到授予的构建文件 共享/ build.gradle.kts. 对于将为Xcode框架打包框架的共享项目。

val packForXcode by tasks.creating(Sync::class) {
}
group = "build"
/// selecting the right configuration for the iOS
/// framework depending on the environment
/// variables set by Xcode build
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
val framework = kotlin.targets
  .getByName<KotlinNativeTarget>(targetName)
  .binaries
  .getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
}
val targetDir = File(buildDir, "xcode-frameworks")
from({ framework.outputDirectory })
into(targetDir)
/// generate a helpful ./gradlew wrapper with embedded Java path
doLast {
  val gradlew = File(targetDir, "gradlew")
  gradlew.writeText("#!/bin/bash\n"
        + "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
        + "cd '${rootProject.rootDir}'\n"
        + "./gradlew \[email protected]\n")
  gradlew.setExecutable(true)
}
tasks.getByName("build").dependsOn(packForXcode)
ls -l shared/build/xcode-frameworks

cd "$SRCROOT/../../shared/build/xcode-frameworks"
./gradlew :shared:build -PXCODE_CONFIGURATION=${CONFIGURATION}

xcodeproj=iosApp/HelloKMP

iOS共享代码

使用iOS应用程序项目到位并与共享项目联系,接下来您将使用Hellokmp应用程序的IOS版本中的共享代码。 iOS应用程序主要由用户界面代码组成,依赖于共享代码来完成大部分工作。

import shared
Text(Greeting().greeting())

挑战

您拥有一个真实的简单Kotlin Multiplatform应用程序,用于iOS和Android,它在两个平台之间使用共享代码。

关键点

  • Kotlin Multiplatform. 是跨平台应用程序开发的一种新的和禁食方法。
  • KMP LAT,您可以在iOS,Android,Web,Server等之间共享Kotlin代码。
  • 与KMP有许多优势,包括开发人员熟悉Kotlin,本机性能,本机UI代码以及所有平台上的App Business Logic的整合到共享模块。
  • 你用了 预计实际的 在根据需要根据不同平台上依赖于具体实施的共享代码中创建公共接口的关键字。

然后去哪儿?

在本章中,您刚刚划伤了Kotlin多平面开发的表面。 KIMP上有一个越来越多的资源,所以请务必寻找他们如何构建更多的现实应用程序,包括在您的应用中提供网络,解析JSON和在本地存储数据。

有一个技术问题?想报告一个错误吗? 您可以在我们的官方书籍论坛中向主办书提出问题和偿还错误 这里.

有反馈分享在线reeding经验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC

你是免费的,用本章的部分归档,如图所示 混淆了 文本。解锁这本书,以及我们整个书籍和视频目录,带有Raywenderlich.com的专业订阅。

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。