Keyword: KMM shared module, Expect/Actual
今天我们来看看范例专案内容,先切换到Project显示,展示整个专案的内容.
KMM可以跨平台运行的魔法,就藏在shared的模组中.
shared正如其名,是负责共用的部分的区块,而其中的commonMain资料夹更是用来存放双平台均通用的部分,让我们点开commonMain的资料夹
可以看到有两个物件,Greeting与Platform.先打开Greeting物件,可以看到下面的程序码.
class Greeting {
fun greeting(): String {
return "Hello, ${Platform().platform}!"
}
}
内容很简单,就有一个方法,内容是呼叫Platform并且回传一串字串.我们再点开Platform看看其中的内容.
expect class Platform() {
val platform: String
}
也是很简单的,但是有一个不大熟悉的关键字出现"expect",并且旁边还有一个特别的符号在.像是一个”A“
点了下去会有两个选项可以选择,还都叫Platform,只是其中一个看路径...好像在iosMain内?随便选一个会发生跳转,这次符号变成了一个"E"
眼尖的人刚刚应该已经注意到在class前面已经分别有Expect与Actual的关键字了.
原来,这个是KMM提供给各平台分别实做的关键字.
由Expect关键字定义这个物件提供怎样的属性与方法.
以这个范例来说就是提供一个字串
而两个以Actual标记的物件,则是各平台对於这个Expect的实作.
可以看到Android的是
actual class Platform actual constructor() {
actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}
并且放在androidMain的package下
而iOS则是
actual class Platform actual constructor() {
actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}
放在iosMain的package下
而最後上层的画面,能直接使用的,只有sharedMain的内容.
可以看看androidApp内的MainActivity,是负责显示的VIew层,在KMM的架构中,显示的View层是由各平台自行实作的.
Android当然是直接使用Kotlin撰写
...
import com.officeyuli.myapplicationkmm.Greeting
...
fun greet(): String {
return Greeting().greeting()
}
...
而iOS的View层,则是由iOS的原生语言Swift撰写
...
import shared
...
struct ContentView: View {
let greet = Greeting().greeting()
var body: some View {
Text(greet)
}
}
了解了KMM如何共用後,明天我们开始修改这个专案,让内容更加丰富
<<: K8s - Kubernetes Django 部署笔记
>>: 从 JavaScript 角度学 Python(11) - 串列 20 种操作的方法
前面我们介绍了影像辨识的资料前处理方法,今天就要开始教大家架设一个神经网路,并将资料丢入来看看实际的...
旧时代的 Speaker Identification 同一人讲不同话,再转成 Mel 之後还是不同...
介绍: k-平均演算法(英文:k-means clustering,以下简称为 k-means )是...
MIME 类别 (IANA 媒体类别) - HTTP | MDN 当我们要发 request 时候,...
我习惯理解一个东西,可以套用日常的生活经验,找出类比、拟人化会帮助我更好理解,今天的议题是最近看到 ...