KMM应用Web端isSystemInDarkTheme()始终返回false求助
问题解答
这不是Bug,而是isSystemInDarkTheme()在Kotlin Multiplatform的Web端实现上存在限制——它并未对接浏览器的系统主题检测API,所以才会始终返回false。
Web端需要直接借助浏览器原生的媒体查询能力来判断系统深色模式,你可以通过以下方式实现:
- 在Kotlin/JS代码中,直接调用浏览器的
window.matchMedia()API:fun isSystemDarkMode(): Boolean { return js("window.matchMedia('(prefers-color-scheme: dark)').matches") } - 如果项目使用了Compose for Web,可改用Compose Web专属的
isSystemInDarkTheme()方法:import androidx.compose.web.window.isSystemInDarkTheme // 在Composable函数内调用 val isDark = isSystemInDarkTheme()
如果需要在KMM共享模块中统一处理全平台的主题判断,建议通过expect/actual机制封装逻辑:
- 在共享模块定义expect函数:
expect fun isSystemDarkTheme(): Boolean - 在Android/iOS等平台用原生的
isSystemInDarkTheme()实现actual:// Android端示例 actual fun isSystemDarkTheme(): Boolean { return androidx.compose.foundation.isSystemInDarkTheme() } - 在Web端用浏览器API实现actual:
// Web端示例 actual fun isSystemDarkTheme(): Boolean { return js("window.matchMedia('(prefers-color-scheme: dark)').matches") }
这样就能在全平台统一调用同一个函数,同时适配Web端的主题检测逻辑。
内容的提问来源于stack exchange,提问作者Julian Egner
相关产品推荐
相关产品推荐

