iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
Mobile Development

認真學 Compose - 對 Jetpack Compose 的問題與探索系列 第 28

D28 / Compose 可以用來做 Desktop App? - Compose JB

寫到最後三天了,想要聊聊和 Android 不完全相關的東西。感謝JetBrains 的開發,和 Kotlin 在 Android 世界的出現,讓 Android Devs 可以順著 Kotlin 這個語言,透過 Kotlin Native / KMM 等方式,接觸到其他的開發。
Compose 則是另一個例子,在 Android Compose UI 逐步成熟後,JetBrains 也丟出了 compose-jb 的專案,讓 Compose 可以用在其他透過 Kotlin 開發的平台。

建立 Kotlin Desktop App

透過 IntelliJ 的精靈,可以直接選擇 Compose Desktop App ( 其實也可以選 Kotlin Multiplatform,只是那個配置比較複雜,建議大家可以去看看這屆鐵人其他大大的分享 )

https://ithelp.ithome.com.tw/upload/images/20211012/20141597J1FYmdwt09.png

精靈會幫我們在入口 function ( main function ) 建立一個 Compose 的入口,透過 Window 包裝:

// Main.kt

fun main() = Window {
    var text by remember { mutableStateOf("Hello, World!") }
    
    MaterialTheme {
        Button(onClick = {
            text = "Hello, Desktop!"
        }) {
            Text(text)
        }
    }
}

IntelliJ 精靈建立的 Compose App ,在 build.gradle.kts 可以看到,是使用 org.jetbrains.compose gradle plugin 0.4.0。為了使用我們習慣的一些 API,建議直接升級到 1.0.0-alpha3
改成 1.0.0-alpha 後:

  • Window 會被 deprecate,請改成 singleWindowApplication
  • repositories 需要加上 google()
  • 需要依賴 kotlin 1.5.21

試著 run 看看吧
https://ithelp.ithome.com.tw/upload/images/20211012/20141597NMYyR9LoDl.png
簡單的 Desktop App 就產生囉!

開始加入圖片

  1. 將圖片放在 main/ 底下的 resource 資料夾下
  2. 在想要的地方加上 Image()
  3. 使用 painterResource("xxx.png") 取得圖片,並放進 Image 的 painter 欄位
    Image(
        painter = painterResource("IntelliJ_IDEA_icon.png"),
        contentDescription = ""
    )

加入滑鼠互動

在 Desktop App 中,主要互動的不會是手指,而是滑鼠。滑鼠的操作比手指精細許多,我們可以透過 Modifier.pointerMoveFilter 來監控滑鼠位置,也可以透過 Modifier.mouseClickable( onClick = {} ) 來增加點擊事件

Image(
    painter = painterResource("Ktor_icon.png"),
    contentDescription = "",
    modifier = Modifier
        .background(
            if (pointOn) Color.Red else Color.Transparent
        )
        .size(120.dp)
        .pointerMoveFilter(
            onEnter = {
                pointOn = true
                false
            },
        )
        .mouseClickable {...}
)

有了這些基本的互動,加上原本就學會的 Compose UI,就可以蓋出一個基本的 Desktop App 了

Build 成 App 吧

Build Koltin Desktop 就和 build 一般的 Java 專案一樣,最單純的方式就是將其 Build 成 jar 檔

./gradlew jar

但是在 compose desktop 的 gradle task group 有貼心的幫我們加上 package 系列的 task,可以用來包裝成可直接安裝的檔案

./gradlew packageDmg

https://ithelp.ithome.com.tw/upload/images/20211012/20141597BjDBbQRFwn.png


今天的內容算是很初淺的初體驗,還有很多內容沒提到。有興趣的建議可以跟著以下教學一一研究:


上一篇
D27 / 怎麼測試? - Testing Compose
下一篇
D29 / Jake 認為 Compose 不是 Compose? - Compose 是什麼
系列文
認真學 Compose - 對 Jetpack Compose 的問題與探索30

尚未有邦友留言

立即登入留言