Day 1 : Kotlin Multiplatform Mobile ,欢迎新的跨平台挑战者

Keyword: Kotlin Multiplatform Mobile
(在每篇的开头会标注这篇的重点内容与技术,让大家更有印象,已经很熟悉了就请直接跳过吧)
(另外由於Kotlin Multiplatform Mobile的架构上比较复杂,所以我也会每隔一段落将专案放在这个区块)


https://github.com/officeyuli/itHome2021/raw/main/day1/KMM_release_banners_blogpost.png

介绍Kotlin Multiplatform Mobile

Kotlin Multiplatform Mobile(简称KMM),是Kotlin官方Jetbrain所推出的一套跨平台框架,最大程度地利用

Kotlin的跨平台特性,达到公用大部分程序码的效益.至於有些平台才独有的特性,例如画面的呈现,蓝芽或GPS的功能,也能利用特殊的语法,让各自平台独立实现独有的特色.

这样直接讲大概还是蒙蒙懂懂的,让我们从实例开始...

举例来说

现在想要做一个App,可以播放用户Youtube上的播放清单...
流程大概如下:

iOS:登入用户的Youtube帐户 ->取得播放清单 ->显示在iPhone画面上 ->用户播放
Android:登入用户的Youtube帐户 ->取得播放清单 ->显示在Android画面上 ->用户播放

有注意到吗?前面登入 "登入用户的Youtube帐户 ->取得播放清单"

不管哪个平台,这段是重复的,但由於平台不同,所以要分别写两次.

所以藉由KMM的协助,我们可以将"登入用户的Youtube帐户 ->取得播放清单" 的流程共用同一份Code

而最後显示内容的部分,iOS可能使用独有的tableView ,而Android可以使用RecyclerView,由於各平台的画面

差距过於巨大,并且是使用者最容易受到影响的部分,所以仍然交还给各平台自己实作.

https://github.com/officeyuli/itHome2021/raw/main/day1/KMM-release-scheme_Blogpost.jpeg

官方的架构图上可以很清楚地看到,View层的部分由各平台的原Code实作,下方的商业逻辑等等的部分则是共用.

而如果有要使用特别的平台Api,仍然可以依据各平台来定义(下方的绿色部分).在实现共用的同时,也提供了很大的自由度.

那是怎麽做到的呢?

Kotlin官方是怎麽做到这件事的呢? 就算因为Kotlin 以JVM为底,继承了Java "一次编译,处处执行"的特性,

iOS的装置上可没有JVM呢.

原来,官方在编译的过程中做了手脚,补上了一层"翻译".就是中间的"Kotlin/JVM" "Kotlin/Native"
"Kotlin/JS",把Kotlin翻译成各平台原生的语言, 让就算没有JVM的环境,也能认得Kotlin 的code,而这个翻译官,是根据每个平台来特制,也因此KMM目前支援的只有iOS与Android,而Javascript的版本还正在开发中,相信在不久的未来我们就能使用到WEB版的KMM啦

KMM的优点与缺点

优点

1.一份底层的code可以共用,节省开发能量.

2.可以自然而然的利用架构解耦,有些时候明知这边需要使用架构的特性,但是因为没有明显的危害,有些开发者就会不遵循架构开发,使用快解来方便行事,久而久之Code Space的品质就会下降,而在KMM架构里面,由於底层强制要求是pure kotlin,所以减少了许多胡乱使用的可能.

3.最重要的是,大部分的跨平台框架都会面临的一个问题:"改版".不管是iOS或是Android,每年都有大改版,通常这时候会推出新特性,新UI,新元件等等,而一般的跨平台框架就必须等到框架官方开发出新版本,才可以使用这些特性或功能.而KMM因为保留了一部分的原生的弹性,因此可以像是原生一样直接使用.

缺点

1.可以共用的部分相较其他跨平台框架来说稍微少一点,以商业逻辑以及资料面的的部分居多,有些时候还是要为各平台特制一些区块.

2.仍然要写部分的原生Code,尤其是画面的部分.

3.编译时间拉长,为了将Kotlin Code转换成各平台的原生Code ,需要花费额外时间.

了解了KMM ,明天会进入KMM的架构介绍!


<<:  Day 05:「别过来!要保持社交距离!」 Tailwind 中的空间与距离

>>:  Material UI in React [Day5] Theme ( Spacing & Breakpoints & z-index)

写机器人必备 -- 函式的操作

创建第一个函式 def functionname([parameterlist]): ["...

Kotlin Android 第4天,从 0 到 ML - 条件判断

前言: 有了变数,就要知道如何用变数来判断下一步要作什麽事呀。来看看kotlin 条件判断 有什麽不...

Day.12 Queue

Queue(队列)是一种先进先出(FIFO)的资料结构 平常在超市排队是一样,先进来排的人愈早结帐,...

Day 20:非 GUI 类工具之 juce::Analytics

为简化使用者行为采集,JUCE 提供了 juce::Analytics 以及相关介面,让开发者依需求...

Unity与Photon的新手相遇旅途 | Day21-Photon Lobby UI (上)

今天讲的内容为制作Lobby的一些基本简单UI,内容分为上下两集。 ...