SlideShare a Scribd company logo
以 Compose & Ktor 打造 Mobile、Desktop 及 Backend API
以 otlin Multiplatform 制霸全平台
Photo by Jared Murray on Unsplash
范聖佑
JetBrains
Developer Advocate
John Lu
時刻科技
Android Developer
黃健旻
純函式
共同創辦⼈
範例程式碼
—
https://github.com/shengyou/kotlin-multiplatform-demo
Kotlin 發展史
—
2011
JetBrains 公開
Kotlin 語⾔
2016
正式發佈
Kotlin 1.0
2017
Google I/O宣佈
⽀援以 Kotlin
開發 Android
2019
Google I/O宣佈
Android 開發將
以 Kotlin 優先
2022
發佈 Kotlin 1.7
• General-purpose
• Static typing
• OOP + FP
• Open Source (Apache 2.0)
多平台開發痛點
—
• 語⾔只專注在特定平台
• UI 長得像但⼜不太⼀樣
• 業務邏輯需要在各平台分別實作
多平台開發痛點
—
• 語⾔只專注在特定平台
• UI 長得像但⼜不太⼀樣
• 業務邏輯需要在各平台分別實作
多平台開發痛點
—
• 語⾔只專注在特定平台
• UI 長得像但⼜不太⼀樣
• 業務邏輯需要在各平台分別實作
DTO
Validation
Service
HTTP
Kotlin Multiplatform
—
Server
Kotlin/JVM
Web
Kotlin/JS
Desktop
Kotlin/JVM
Android
Kotlin/JVM
iOS
Kotlin/Native
Kotlin 編譯器
—
儘可能的 Share Code
—
Compose for Web
Common Kotlin
UI
Logic
Server Web Desktop Android iOS
Compose for Desktop Jackpot Compose
DTO(s) Service
Validation
HTTP (Req & Res)
SwiftUI
or
Multiplatform UI
Compose for Web
Common Kotlin
UI
Logic
Server Web Desktop Android iOS
Compose for Desktop Jackpot Compose
DTO(s) Service
Validation
HTTP (Req & Res)
SwiftUI
or
Multiplatform UI
本⽇⽰範
—
註冊流程
—
註冊帳號
產⽣ QR Code
登入流程
—
驗證帳號
及
認證碼
取得認證碼
專案架構
—
Server
Desktop Android
• 以 Ktor 實作註冊及登入 API
• TOTP 驗證機制
• 以 Jetpack Compose 實作 UI
• 串接 API
• 以 Compose for Desktop 實作 UI
• 串接 API
• 共⽤ DTO(s)
• 共⽤ Client SDK
• 共⽤ UI
建立 Multiplatform 專案
—
專案結構
—
• android → Android 主程式
• common → 共⽤ UI 及商業邏輯
• desktop → Desktop 主程式
• server → Backend API 主程式
Server
Desktop Android
• 以 Ktor 實作註冊及登入 API
• TOTP 驗證機制
Ktor 框架
—
Server Client
語法簡單
輕量
適合做微服務
HTTP Client
⽀援多平台
搭配 kotlinx.serialization 做 SDK
程式進入點
—
fun main() {
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
!" Plugin List
!" !!#
}.start(wait = true)
}
設定 Routing
—
fun Application.configureTwoFactorAuth() {
routing {
install(ContentNegotiation) {
json()
}
get("!!#url!!#") {
!" !!#
}
post("!!#url!!#") {
!" !!#
}
}
}
設定 Handler
—
suspend fun signup(call: ApplicationCall) =
run {
val request = call.receive<UserSignupRequest>()
!" !!#
call.respond(
status = HttpStatusCode.OK,
message = !!#
)
}
設定 DTO(s)
—
@Serializable
data class UserSignupRequest(
val email: String,
val password: String,
)
@Serializable
data class UserLoginRequest(
val email: String,
val password: String,
val authenticationCode: String,
)
TOTP - Time-base one-time password
—
圖片來源: twilio 官⽅部落格
實作 TOTP 的⼯具
—
https://github.com/samdjstevens/java-totp
產⽣ QR Code
—
QrData
.Builder()
.label("!!#")
.secret("!!#")
.issuer("!!#")
.algorithm(HashingAlgorithm.SHA1)
.digits(6)
.period(30)
.build()
.run { ZxingPngQrGenerator().generate(this) }
回傳 QR Code
—
suspend fun qrcode(call: ApplicationCall) =
run {
!" !!#
call.respondBytes(
bytes = !!#,
contentType = ContentType.Image.PNG,
status = HttpStatusCode.OK,
)
}
Client (a.k.a SDK)
—
class MopconClient(
private val urlString: String = "!!#"
) : MopconClientContract {
private val httpClient = HttpClient {
install(ContentNegotiation) {
json()
}
}
override suspend fun signup(!!#) =
httpClient.post("!!#") {
setBody(userSignupRequest)
contentType(ContentType.Application.Json)
}.body()
}
Server
Desktop Android
• 以 Jetpack Compose 實作 UI
• 串接 API
Jetpack Compose
—
• Declarative
• Embrasces Kotlin
• Inter-ops with Views
• Unbundled from OS
Jim Sproch 帶領團
隊開始著⼿研發
Jetpack Compose
May
2017
Google I/O宣佈⽀
援以 Kotlin 開發
Android
May
2019
Google I/O宣佈
Android 開發將以
Kotlin 優先
May
2021
Jetpack Compose
發佈 1.0 版
July
Jetpack Compose 發展史
—
實作 UI
—
@Composable
fun WelcomeScreen(
!" !!#
) {
!" !!#
}
@Preview
@Composable
fun WelcomeScreenPreview() {
WelcomeScreen(!!")
}
實作 Satate
—
@Immutable
data class AppState(
!" !!#
) {
!" !!#
}
實作 View Model
—
class AppViewModel(
private val client: MopconClientContract,
) : ViewModel(), AppViewModelContract {
private val _uiState = MutableStateFlow(AppState())
override val uiState: StateFlow<AppState> = _uiState.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5_000),
AppState()
)
override fun signup(username: String, password: String) {
viewModelScope.launch {
kotlin.runCatching {
client.signup(!$ !!# !%)
}.onSuccess {
!# !!"
navigateTo(Screen.AuthenticationCode)
}
}
}
}
Server
Desktop Android
• 以 Compose for Desktop 實作 UI
• 串接 API
Jim Sproch 帶領團
隊開始著⼿研發
Jetpack Compose
May
2020
Nikolay Igotti 帶領
團隊將 Compose 變
成 Multiplatform
September
2021
Jetpack Compose
發佈 1.0 版
July
Compose
Multiplatfom
發佈 1.0 版
December
Compose Multiplatform 發展史
—
2017
Google I/O宣佈⽀
援以 Kotlin 開發
Android
May
2019
Google I/O宣佈
Android 開發將以
Kotlin 優先
May
Compose ⽣態系
—
多平台
Jetpack Compose
建立⼿機應⽤程式介⾯
Compose for Desktop
建立桌⾯應⽤程式介⾯
Compose for Web
建立網⾴應⽤程式介⾯
Desktop 起⼿式
—
fun main() = application {
val viewModel = AppViewModel(MopconClient())
Window(
onCloseRequest = !&exitApplication,
title = "MOPCON Demo App",
state = WindowState(
size = DpSize(500.dp, 800.dp),
position = WindowPosition.Aligned(Alignment.Center)
)
) {
!# !!"
}
}
多平台共⽤
—
• android → Android 主程式
• common → 共⽤程式
- androidMain → 平台專⽤實作
- commonMain → 共⽤核⼼ (如 UI、SDK 等)
- desktopMain → 平台專⽤實作
• desktop → Desktop 主程式
androidMain
commonMain
desktopMain
@Composable
expect fun Logo()
@Composable
actual fun Logo() {
Image(
painter = painterResource(id = R.drawable.mopcon_logo),
)
}
@Composable
actual fun Logo() {
Image(
painter = painterResource("mopcon-logo.jpg"),
)
}
平台差異 pt.1
—
平台差異 pt.2
—
https://github.com/alialbaali/Kamel
commonMain
build.gradle.kts
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
!" !!#
implementation("com.alialbaali.kamel:kamel-image:0.4.1")
}
}
}
}
KamelImage(
resource = lazyPainterResource(data = url),
onLoading = { CircularProgressIndicator(it) }
)
平台差異 pt.2
—
#
本⽇重點回顧
多平台開發痛點
—
• 語⾔只專注在特定平台
• UI 長得像但⼜不太⼀樣
• 業務邏輯需要在各平台分別實作
Kotlin 編譯器
—
多平台共享
—
Compose for Web
Common Kotlin
UI
Logic
Server Web Desktop Android iOS
Compose for Desktop Jackpot Compose
DTO(s) Service
Validation
HTTP (Req & Res)
SwiftUI
or
Multiplatform UI
Kotlin Multiplatform 的好處
—
• 多個平台使⽤同⼀種熟悉的語⾔
• 在平台間共⽤程式碼
• 最⼤化的共⽤ UI
• 儘可能的 Native
• Serialization
• Coroutine
• Datetime
• Ktor
Kotlin Multiplatform ⽣態系
—
⚠
Sample Code 畢竟是 Sample Code
• Server 端接上 DB
• Server 端的驗證和 QR Code 讀取防護
• Server 端和 Client 端共⽤驗證邏輯
• Android 端導入更多的 Clean Architecture
• Desktop 端考量不同平台的 UI 設計
• Desktop 端導入更多的 Clean Architecture
永遠可以更好
—
https://github.com/joreilly/PeopleInSpace
全平台開發範例
—
• 所有平台⼀應俱全!
SwiftUI
or
Multiplatform UI
Compose for Web
Common Kotlin
UI
Logic
Server Web Desktop Android iOS
Compose for Desktop Jackpot Compose
DTO(s) Service
Validation
HTTP (Req & Res)
Kotlin Multiplatform 的各種⼦專案
—
Kotlin Multiplatform Mobile
Compose for Web
Common Kotlin
UI
Logic
Server Web Desktop Android iOS
Compose for Desktop Jackpot Compose
DTO(s) Service
Validation
HTTP (Req & Res)
SwiftUI
or
Multiplatform UI
Kotlin Multiplatform 的各種⼦專案
—
Compose Multiplatform
• 純函式咖啡
- https://github.com/PureFuncInc/purefunc-cafe
- 每週三晚上九點在 https://discord.gg/purefunc 的語⾳頻道⼤家⼀
起參與
• 純函式技術週報
- https://github.com/PureFuncInc/purefunc-technique-weekly-news
- 每週三出刊
Kimoji
⽤ Emoji 記錄你的⼼情⽇記
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
歡迎參加 Kotlin 社群
—
Line 群 Telegram 群
加入討論群取得最新資訊
tw.kotlin.tips
Kotlin Collection
全⽅位解析攻略
—
collection.kotlin.tips
• 詳解 200+ Collection ⽅法
• 解析標準函式庫原始碼
• 實務範例
• 免費下載速查地圖
關注粉絲⾴及頻道
—
Coding 職⼈塾
Kraftsman
Q&A
—
以 Kotlin Multiplatform 制霸全平台
范聖佑
JetBrains Developer Advocate
shengyou.fan@jetbrains.com
John Lu
時刻科技 Android Developer
johnlu@seekrtech.com
黃健旻
純函式共同創辦⼈
vincent@purefunc.net
以 Compose & Ktor 打造 Mobile、Desktop 及 Backend API
% 會後問答集
https://bit.ly/qa-for-kotlin-multiplatform

More Related Content

PDF
初探 Kotlin Multiplatform
PDF
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
PDF
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
PDF
[COSCUP 2022] Kotlin Collection 遊樂園
PDF
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
PDF
老派浪漫:用 Kotlin 寫 Command Line 工具
PDF
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
PPTX
コンテナネットワーキング(CNI)最前線
初探 Kotlin Multiplatform
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
[COSCUP 2022] Kotlin Collection 遊樂園
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
老派浪漫:用 Kotlin 寫 Command Line 工具
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
コンテナネットワーキング(CNI)最前線

What's hot (20)

PPTX
Introduction to Powershell Version 5
PDF
使用 laravel 的前與後
PPSX
Docker Kubernetes Istio
PDF
WebRTC と Native とそれから、それから。
PDF
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
PDF
Introduction to container based virtualization with docker
PDF
React Nativeの光と闇
PDF
초보자를 위한 Git & GitHub
PDF
우아한 모노리스
PDF
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
PDF
Dockerイメージの理解とコンテナのライフサイクル
PDF
Introduction to Kubernetes RBAC
PDF
今から始めるUbuntu入門_202307.pdf
PDF
Coroutines for Kotlin Multiplatform in Practise
PDF
How to test infrastructure code: automated testing for Terraform, Kubernetes,...
PDF
Introduction to Docker storage, volume and image
PPT
presentation on Docker
PDF
Jenkins 再入門
PDF
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
PPTX
WebRTC SFU Mediasoup Sample update
Introduction to Powershell Version 5
使用 laravel 的前與後
Docker Kubernetes Istio
WebRTC と Native とそれから、それから。
[MeetUp][1st] 오리뎅이의_쿠버네티스_네트워킹
Introduction to container based virtualization with docker
React Nativeの光と闇
초보자를 위한 Git & GitHub
우아한 모노리스
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerイメージの理解とコンテナのライフサイクル
Introduction to Kubernetes RBAC
今から始めるUbuntu入門_202307.pdf
Coroutines for Kotlin Multiplatform in Practise
How to test infrastructure code: automated testing for Terraform, Kubernetes,...
Introduction to Docker storage, volume and image
presentation on Docker
Jenkins 再入門
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
WebRTC SFU Mediasoup Sample update
Ad

Similar to [MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台 (8)

PDF
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
PPTX
用 Kotlin Multiplatform 創建跨平台的 Android DeepLink 測試工具:Compose Desktop 實踐分享
PDF
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
PDF
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
PPTX
Android Studio & Cloud Vision API 玩圖像辨識
PDF
初窺 Flutter 開發.pdf
PPTX
GitHub android 40項熱門技術
PDF
炎炎夏日學 Android 課程 - Part 0: 環境搭建
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
用 Kotlin Multiplatform 創建跨平台的 Android DeepLink 測試工具:Compose Desktop 實踐分享
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Android Studio & Cloud Vision API 玩圖像辨識
初窺 Flutter 開發.pdf
GitHub android 40項熱門技術
炎炎夏日學 Android 課程 - Part 0: 環境搭建
Ad

More from Shengyou Fan (20)

PDF
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
PDF
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
PDF
How I make a podcast website using serverless technology in 2023
PDF
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
PDF
Using the Exposed SQL Framework to Manage Your Database
PDF
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
PDF
[PHP 也有 Day #64] PHP 升級指南
PDF
Composer 經典食譜
PDF
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
PDF
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
PDF
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
PDF
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
PDF
用 Kotlin 打造讀書會小幫手
PDF
Kotlin 讀書會第三梯次第一章
PDF
用 OPENRNDR 將 Chatbot 訊息視覺化
PDF
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
PDF
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
PDF
Ktor 部署攻略 - 老派 Fat Jar 大法
PDF
以 Kotlin 快速打造 Mobile Backend
PDF
Kotlin 一條龍 - 打造全平台應用
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
How I make a podcast website using serverless technology in 2023
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
Using the Exposed SQL Framework to Manage Your Database
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[PHP 也有 Day #64] PHP 升級指南
Composer 經典食譜
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
用 Kotlin 打造讀書會小幫手
Kotlin 讀書會第三梯次第一章
用 OPENRNDR 將 Chatbot 訊息視覺化
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
Ktor 部署攻略 - 老派 Fat Jar 大法
以 Kotlin 快速打造 Mobile Backend
Kotlin 一條龍 - 打造全平台應用

[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台