You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Multiplatform:macOS Dock点击无法重开已关闭应用的问题求助

macOS Dock图标点击恢复Compose Desktop窗口的解决方案

问题根源

当你点击窗口X按钮时,将isOpen.value设为false,Compose会直接移除Window组件。此时macOS Dock点击图标时,系统找不到可激活的窗口实例,因此没有任何反应。

解决方案一:隐藏窗口而非移除(推荐)

不要通过移除Window组件来关闭窗口,而是通过WindowState的isVisible属性控制窗口显示/隐藏。这样窗口实例始终存在,Dock点击时系统会自动恢复窗口:

val windowState = rememberWindowState(width = 800.dp, height = 900.dp)

Tray(
    icon = TrayIcon,
    menu = {
        Item(
            "Exit",
            onClick = { exitApplication() }
        )
        Item(
            "Open",
            onClick = { windowState.isVisible = true }
        )
    }
)

Window(
    onCloseRequest = { windowState.isVisible = false },
    title = "Teamcity Desktop",
    state = windowState
) {
    // 窗口内容
}

解决方案二:监听Dock点击事件(按需使用)

如果必须通过isOpen控制Window组件的存在,可以通过Java AWT的API监听macOS Dock点击事件,触发时重新设置isOpen.value = true:

import java.awt.Desktop
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue

// 在应用初始化处添加监听
var isOpen by mutableStateOf(true)

if (Desktop.isDesktopSupported()) {
    val desktop = Desktop.getDesktop()
    if (desktop.isSupported(Desktop.Action.APP_OPEN_FILE)) {
        desktop.setOpenFileHandler { _ ->
            isOpen = true
        }
    }
}

// 原有的Tray和Window代码
Tray(
    icon = TrayIcon,
    menu = {
        Item("Exit", onClick = { exitApplication() })
        Item("Open", onClick = { isOpen = true })
    }
)

if (isOpen) {
    Window(
        onCloseRequest = { isOpen = false },
        title = "Teamcity Desktop",
        state = rememberWindowState(width = 800.dp, height = 900.dp)
    ) {
        // 窗口内容
    }
}

总结

优先选择第一种方案,它更贴合Compose的组件生命周期逻辑,无需额外处理原生系统事件,代码更简洁可靠。

内容的提问来源于stack exchange,提问作者Eric Savoie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:50:24