Compose Desktop动态修改Window启用状态不生效,是否为预期行为?
Jewel库DecoratedWindow的enabled参数动态更新问题解答
这不是预期行为,属于Jewel库中Window/DecoratedWindow组件的已知缺陷:组件仅在初始化阶段读取enabled参数的值,后续Composable重组时不会监听该参数的变更,导致窗口状态无法随参数动态更新。
问题原因
- 无论是直接将
enabled传入DecoratedWindow的参数,还是手动调用window.isEnabled = enabled,由于组件内部没有绑定该参数的状态监听逻辑,上游重组带来的参数变化不会触发窗口状态的同步更新。 - 只有组件首次初始化时的
enabled值会生效,后续参数变更完全被忽略。
临时解决方案
可以通过LaunchedEffect监听enabled参数的变化,在参数更新时强制同步窗口状态:
class DecoratedWindowImpl : DecoratedWindowInterface { @Composable override fun Create( state: WindowState, enabled: Boolean, onCloseRequest: () -> Unit, content: @Composable DecoratedWindowScope.() -> Unit, ) { DecoratedWindow( state = state, enabled = enabled, onCloseRequest = onCloseRequest, ) { // 监听enabled参数变更,动态更新窗口启用状态 LaunchedEffect(enabled) { window.isEnabled = enabled } content() } } }
另外,也可以向Jewel库官方提交Issue,反馈组件缺少enabled参数的重组响应逻辑,推动官方从底层修复该问题。
内容的提问来源于stack exchange,提问作者abarraford
相关产品推荐
相关产品推荐

