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
相关产品推荐
相关产品推荐

