From 00856eeaf78e03baf6a61504f732e5f48e448049 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Tue, 8 Sep 2026 22:45:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E6=B5=85=E8=89=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=A0=8F=E5=9B=BE=E6=A0=87=E6=94=B9=E6=B7=B1?= =?UTF-8?q?=E8=89=B2=EF=BC=9B=E8=BF=94=E5=9B=9E=E9=94=AE=E9=80=90=E5=B1=82?= =?UTF-8?q?=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CyreneRoot 用 WindowInsetsControllerCompat 跟随主题切换系统栏明暗;ChatHomeScreen 为设置页与抽屉各加 BackHandler,避免直接回桌面。 --- .../kotlin/top/yeij/cyrene/app/CyreneRoot.kt | 32 ++++++++++++++++++- .../top/yeij/cyrene/ui/chat/ChatHomeScreen.kt | 9 +++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/top/yeij/cyrene/app/CyreneRoot.kt b/app/src/main/kotlin/top/yeij/cyrene/app/CyreneRoot.kt index 52ea4cb..84be216 100644 --- a/app/src/main/kotlin/top/yeij/cyrene/app/CyreneRoot.kt +++ b/app/src/main/kotlin/top/yeij/cyrene/app/CyreneRoot.kt @@ -1,9 +1,16 @@ package top.yeij.cyrene.app +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat import top.yeij.cyrene.core.prefs.AppPrefs import top.yeij.cyrene.core.prefs.LocalAppPrefs import top.yeij.cyrene.core.prefs.ThemeMode @@ -11,11 +18,28 @@ import top.yeij.cyrene.core.theme.CyreneTheme import top.yukonga.miuix.kmp.theme.ColorSchemeMode /** - * 应用根:读 App 偏好 → 决定 Miuix 主题模式 → 通过 [LocalAppPrefs] 下发给渲染层。 + * 应用根:读 App 偏好 → 决定 Miuix 主题模式 → 通过 [LocalAppPrefs] 下发给渲染层, + * 同时把系统栏图标明暗跟着主题走(否则浅色模式下白字白底看不见)。 */ @Composable fun CyreneRoot(container: AppContainer) { val prefs by container.appSettings.data.collectAsState(initial = AppPrefs()) + val darkTheme = when (prefs.themeMode) { + ThemeMode.System -> isSystemInDarkTheme() + ThemeMode.Light -> false + ThemeMode.Dark -> true + } + + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = view.context.findActivity()?.window ?: return@SideEffect + WindowCompat.getInsetsController(window, view).apply { + isAppearanceLightStatusBars = !darkTheme + isAppearanceLightNavigationBars = !darkTheme + } + } + } CompositionLocalProvider(LocalAppPrefs provides prefs) { CyreneTheme(mode = prefs.themeMode.toColorSchemeMode()) { @@ -29,3 +53,9 @@ private fun ThemeMode.toColorSchemeMode(): ColorSchemeMode = when (this) { ThemeMode.Light -> ColorSchemeMode.Light ThemeMode.Dark -> ColorSchemeMode.Dark } + +private tailrec fun Context.findActivity(): Activity? = when (this) { + is Activity -> this + is ContextWrapper -> baseContext.findActivity() + else -> null +} diff --git a/app/src/main/kotlin/top/yeij/cyrene/ui/chat/ChatHomeScreen.kt b/app/src/main/kotlin/top/yeij/cyrene/ui/chat/ChatHomeScreen.kt index c58d78b..baea813 100644 --- a/app/src/main/kotlin/top/yeij/cyrene/ui/chat/ChatHomeScreen.kt +++ b/app/src/main/kotlin/top/yeij/cyrene/ui/chat/ChatHomeScreen.kt @@ -1,5 +1,6 @@ package top.yeij.cyrene.ui.chat +import androidx.activity.compose.BackHandler import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -15,7 +16,10 @@ import top.yeij.cyrene.ui.sessions.SessionDrawerContent import top.yeij.cyrene.ui.sessions.SessionsViewModel import top.yeij.cyrene.ui.settings.SettingsScreen -/** 聊天页 + 侧边栏(会话切换)+ 设置页。 */ +/** + * 聊天页 + 侧边栏(会话切换)+ 设置页。 + * 返回键逐层回退:设置 → 聊天;抽屉打开时先关抽屉;都关着才交给系统(回桌面)。 + */ @Composable fun ChatHomeScreen( container: AppContainer, @@ -28,6 +32,9 @@ fun ChatHomeScreen( var drawerOpen by remember { mutableStateOf(false) } var showSettings by remember { mutableStateOf(false) } + BackHandler(enabled = showSettings) { showSettings = false } + BackHandler(enabled = drawerOpen) { drawerOpen = false } + if (showSettings) { SettingsScreen(container = container, onBack = { showSettings = false }) } else {