SlideShare a Scribd company logo
1 of 43
Download to read offline
范聖佑 (Shengyou Fan)
JetBrains Developer Advocate
JCConf Taiwan 2022
2022/10/07
開發桌⾯軟體的新選擇
Compose for Desktop
範例程式碼
—
多平台 https://github.com/shengyou/lottery-machine-multiplatform
Desktop 平台 https://github.com/shengyou/lottery-machine-desktop
Compose 發展史
—
Jim Sproch 帶領團
隊開始著⼿研發
Jetpack Compose
May
2017
Google I/O宣佈⽀
援以 Kotlin 開發
Android
May
2019
Google I/O宣佈
Android 開發將以
Kotlin 優先
May
2020
Nikolay Igotti 帶領
團隊將 Compose 變
成 Multiplatform
September
2021
Jetpack Compose
發佈 1.0 版
July
Compose
Multiplatfom
發佈 1.0 版
December
Compose 是什麼?
—
• Declarative UI 框架
• 使⽤函式來描述 UI 及狀態
• 完全使⽤ Kotlin 開發
• 提供 Typesafe APIs
• 以 Skia 渲染畫⾯*
* Compose for Desktop
Compose ⽣態系
—
多平台
Jetpack Compose
建立⼿機應⽤程式介⾯
Compose for Desktop
建立桌⾯應⽤程式介⾯
Compose for Web
建立網路應⽤程式介⾯
範例:樂透抽獎機
—
• 1~49 號碼球
• 以 7 x 7 矩陣排列
• 每按⼀次按鈕
• 隨機抽取 6 個
• 抽到的數字會變⾊
#
跟 Jetpack Compose ⼀樣的地⽅?
可使⽤的 Jetpack Compose Package
—
• androidx.compose.runtime
• androidx.compose.fundation
• androidx.compose.ui
• androidx.compose.material
⚠
跟 Jackpack Compose 不同的地⽅?
不同運⾏環境
—
• 較簡單的 Life Cycle
• 較少的權限限制
不同的 UI/UX
—
• 反思 Material Design 在
Desktop 上的適⽤性
• 社群製作的 Theme
• 社群製作的 UI 元件庫
不同的 UI/UX
—
• 反思 Material Design 在
Desktop 上的適⽤性
• 社群製作的 Theme
• 社群製作的 UI 元件庫
不同的 UI/UX
—
• 反思 Material Design 在
Desktop 上的適⽤性
• 社群製作的 Theme
• 社群製作的 UI 元件庫
Desktop 特有元件
—
• Window
• Menu*
• Tooltip
• Tray
• Scrollbar*
• Notification*
Desktop 特有元件
—
• Window
• Menu*
• Tooltip
• Tray
• Scrollbar*
• Notification*
Desktop 特有元件
—
• Window
• Menu*
• Tooltip
• Tray
• Scrollbar*
• Notification*
Desktop 特有元件
—
• Window
• Menu*
• Tooltip
• Tray
• Scrollbar*
• Notification*
Desktop 特有元件
—
• Window
• Menu*
• Tooltip
• Tray
• Scrollbar*
• Notification*
Desktop 特有元件
—
• Window
• Menu*
• Tooltip
• Tray
• Scrollbar*
• Notification*
Desktop 特有事件
—
• MouseEnter
• MouExit
• MouseMove
• KeyDown
• KeyUp
• Keyboard Shortcut
不同的開發⽣態系 pt.1
—
• 沒有 ViewModel
• 沒有 Navigation
• 沒有 Room
• 沒有 Hilt
• 沒有 Firebase
不同的開發⽣態系 pt.2
—
• 但有完整的 JVM ⽣態:
- ⽤ Decompose 取代 Navigation
- ⽤ SqlDelight 取代 Room
- ⽤ Dagger 取代 Hilt
- ⽤ Arbor 取代 Timber
不同的發佈管道
—
• 有打包⽤的 Gradle Task
- 各作業系統要分別⽤對應機器打包
• 沒有 Play Store
- ⽤ update4j 做⾃動更新
%
說到底,好處在哪裡?
Compose for Desktop 的優勢
—
• 單⼀語⾔
• 相同語法
• 成熟的 JVM ⽣態系
• 可跟 Swing 互⽤
• 更重要的是…
&
多平台共⽤ UI!
Compose Multiplatform
—
• android → Android 主程式
• common → 共⽤ UI 及商業邏輯
- androidMain → 平台專⽤實作 (actual)
- commonMain → 共⽤核⼼ (expect)
- desktopMain → 平台專⽤實作 (actual)
• desktop → Desktop 主程式
Desktop
SwiftUI
Android
Jetpack Compose
iOS
Compose for Desktop
Web
Compose for Web
Kotlin Multiplatform
—
Common Kotlin
UI
Logic
Kotlin Multiplatform
—
Desktop
SwiftUI
Android
Jetpack Compose
iOS
Compose for Desktop
Web
Compose for Web
Common Kotlin
UI
Logic
Compose Multiplatform
Kotlin Multiplatform
—
Desktop
SwiftUI
Android
Jetpack Compose
iOS
Compose for Desktop
Web
Compose for Web
Common Kotlin
UI
Logic
Kotlin Multiplatform Mobile
' Terminal UI?!!
%
有實際案例嗎?
JetBrains Toolbox App
—
• Compose for Desktop
的 Production 案例
可讓 UI 在多平台共⽤
Compose Multiplatform
是開發桌⾯軟體的新選擇
Compose for Desktop
快速回顧
—
Kotlin 是⼀個
多平台開發⽣態系
了解更多
—
Jetpack Compose 官網 Compose for Desktop 官網
官⽅教學及範例
—
• 必看資料夾
- tutorials
- examples
推薦影片
—
What about…a desktop
app?
Introducing Compose
for Desktop
Compose Multiplatform
的故事
多平台開發範例
—
• 各平台開發範例
⼀應俱全!
2022 iThome 鐵⼈賽
—
• [已完賽] 傳教⼠的
Compose for Desktop
耕讀筆記
歡迎參加 Kotlin 社群
—
Line 群 Telegram 群
加入討論群取得最新資訊
tw.kotlin.tips
Kotlin Collection 全⽅位解析攻略
—
collection.kotlin.tips
• 詳解 200+ Collection ⽅法
• 解析標準函式庫原始碼
• 實務範例
• 免費下載速查地圖
關注粉絲⾴及頻道
—
Coding 職⼈塾
Kraftsman
開發桌⾯軟體的新選擇
Compose for Desktop
shengyou.fan@jetbrains.com
fb.me/shengyoufan
shengyoufan
@shengyou

More Related Content

What's hot

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
Composer 從入門到實戰
Composer 從入門到實戰Composer 從入門到實戰
Composer 從入門到實戰
Shengyou Fan
 

What's hot (20)

[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
 
step by step to use LINE Notify - 20190527
step by step to use LINE Notify - 20190527step by step to use LINE Notify - 20190527
step by step to use LINE Notify - 20190527
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Jetpack compose
Jetpack composeJetpack compose
Jetpack compose
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
 
Jetpack Compose.pdf
Jetpack Compose.pdfJetpack Compose.pdf
Jetpack Compose.pdf
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
Introduction to Kotlin coroutines
Introduction to Kotlin coroutinesIntroduction to Kotlin coroutines
Introduction to Kotlin coroutines
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented Programming
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
 
Jetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UIJetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UI
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang) [Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
 
Declarative UIs with Jetpack Compose
Declarative UIs with Jetpack ComposeDeclarative UIs with Jetpack Compose
Declarative UIs with Jetpack Compose
 
Composer 從入門到實戰
Composer 從入門到實戰Composer 從入門到實戰
Composer 從入門到實戰
 

Similar to [JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇

Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture
lusecheng
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
Tom Fan
 
Firefox OS Overview
Firefox OS OverviewFirefox OS Overview
Firefox OS Overview
Yan-ren Tsai
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
Hsu Ping Feng
 

Similar to [JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇 (20)

用 Kotlin Multiplatform 創建跨平台的 Android DeepLink 測試工具:Compose Desktop 實踐分享
用 Kotlin Multiplatform 創建跨平台的 Android DeepLink 測試工具:Compose Desktop 實踐分享用 Kotlin Multiplatform 創建跨平台的 Android DeepLink 測試工具:Compose Desktop 實踐分享
用 Kotlin Multiplatform 創建跨平台的 Android DeepLink 測試工具:Compose Desktop 實踐分享
 
Build Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratchBuild Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratch
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
CICD Workshop 20180922
CICD Workshop 20180922CICD Workshop 20180922
CICD Workshop 20180922
 
Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
 
Unity3d Script System & agile dev
Unity3d Script System & agile devUnity3d Script System & agile dev
Unity3d Script System & agile dev
 
twMVC#36.NetCore 3快速看一波
twMVC#36.NetCore 3快速看一波twMVC#36.NetCore 3快速看一波
twMVC#36.NetCore 3快速看一波
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
 
Go for web
Go for webGo for web
Go for web
 
Establish The Core of Cloud Computing Application by Using Hazelcast (Chinese)
Establish The Core of  Cloud Computing Application  by Using Hazelcast (Chinese)Establish The Core of  Cloud Computing Application  by Using Hazelcast (Chinese)
Establish The Core of Cloud Computing Application by Using Hazelcast (Chinese)
 
GDC Taipei Summit review 2012
GDC Taipei Summit review 2012GDC Taipei Summit review 2012
GDC Taipei Summit review 2012
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事
 
COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習
COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習
COSCUP 2019 國際開放原始碼專案經營 - 從失敗中學習
 
開放原始碼作為新事業: 台灣本土經驗談 (COSCUP 2011)
開放原始碼作為新事業: 台灣本土經驗談 (COSCUP 2011)開放原始碼作為新事業: 台灣本土經驗談 (COSCUP 2011)
開放原始碼作為新事業: 台灣本土經驗談 (COSCUP 2011)
 
Firefox OS Overview
Firefox OS OverviewFirefox OS Overview
Firefox OS Overview
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
 

More from Shengyou Fan

More from Shengyou Fan (19)

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

[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇