fix(ui): 浅色模式系统栏图标改深色;返回键逐层回退

CyreneRoot 用 WindowInsetsControllerCompat 跟随主题切换系统栏明暗;ChatHomeScreen 为设置页与抽屉各加 BackHandler,避免直接回桌面。
This commit is contained in:
AskaEth committed 2026-09-08 22:45:20 +08:00
1 parent 61214a18fa
commit 00856eeaf7
2 files changed
+39 -2

No files matched your search

@@ -1,9 +1,16 @@
package top.yeij.cyrene.app 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.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue 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.AppPrefs
import top.yeij.cyrene.core.prefs.LocalAppPrefs import top.yeij.cyrene.core.prefs.LocalAppPrefs
import top.yeij.cyrene.core.prefs.ThemeMode 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 import top.yukonga.miuix.kmp.theme.ColorSchemeMode
/** /**
* 应用根:读 App 偏好 → 决定 Miuix 主题模式 → 通过 [LocalAppPrefs] 下发给渲染层。 * 应用根:读 App 偏好 → 决定 Miuix 主题模式 → 通过 [LocalAppPrefs] 下发给渲染层,
* 同时把系统栏图标明暗跟着主题走(否则浅色模式下白字白底看不见)。
*/ */
@Composable @Composable
fun CyreneRoot(container: AppContainer) { fun CyreneRoot(container: AppContainer) {
val prefs by container.appSettings.data.collectAsState(initial = AppPrefs()) 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) { CompositionLocalProvider(LocalAppPrefs provides prefs) {
CyreneTheme(mode = prefs.themeMode.toColorSchemeMode()) { CyreneTheme(mode = prefs.themeMode.toColorSchemeMode()) {
@@ -29,3 +53,9 @@ private fun ThemeMode.toColorSchemeMode(): ColorSchemeMode = when (this) {
ThemeMode.Light -> ColorSchemeMode.Light ThemeMode.Light -> ColorSchemeMode.Light
ThemeMode.Dark -> ColorSchemeMode.Dark ThemeMode.Dark -> ColorSchemeMode.Dark
} }
private tailrec fun Context.findActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null
}
@@ -1,5 +1,6 @@
package top.yeij.cyrene.ui.chat package top.yeij.cyrene.ui.chat
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue 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.sessions.SessionsViewModel
import top.yeij.cyrene.ui.settings.SettingsScreen import top.yeij.cyrene.ui.settings.SettingsScreen
/** 聊天页 + 侧边栏(会话切换)+ 设置页。 */ /**
* 聊天页 + 侧边栏(会话切换)+ 设置页。
* 返回键逐层回退:设置 → 聊天;抽屉打开时先关抽屉;都关着才交给系统(回桌面)。
*/
@Composable @Composable
fun ChatHomeScreen( fun ChatHomeScreen(
container: AppContainer, container: AppContainer,
@@ -28,6 +32,9 @@ fun ChatHomeScreen(
var drawerOpen by remember { mutableStateOf(false) } var drawerOpen by remember { mutableStateOf(false) }
var showSettings by remember { mutableStateOf(false) } var showSettings by remember { mutableStateOf(false) }
BackHandler(enabled = showSettings) { showSettings = false }
BackHandler(enabled = drawerOpen) { drawerOpen = false }
if (showSettings) { if (showSettings) {
SettingsScreen(container = container, onBack = { showSettings = false }) SettingsScreen(container = container, onBack = { showSettings = false })
} else { } else {