refactor: 优化颜色模式和主题色版的性能与样式

This commit is contained in:
Super12138 2025-11-09 19:13:42 +08:00
parent 84c49542c0
commit a7311bfddf
4 changed files with 47 additions and 52 deletions

View file

@ -63,12 +63,12 @@ fun SettingsAppearance(
) )
DarkModePicker( DarkModePicker(
currentDarkMode = DarkMode.fromId(darkMode), currentDarkMode = { DarkMode.fromId(darkMode) },
onDarkModeChange = { scope.launch { DataStoreManager.setDarkMode(it.id) } } onDarkModeChange = { scope.launch { DataStoreManager.setDarkMode(it.id) } }
) )
PalettePicker( PalettePicker(
currentPalette = PaletteStyle.fromId(paletteStyle), currentPalette = { PaletteStyle.fromId(paletteStyle) },
onPaletteChange = { scope.launch { DataStoreManager.setPaletteStyle(it.id) } }, onPaletteChange = { scope.launch { DataStoreManager.setPaletteStyle(it.id) } },
isDynamicColor = dynamicColor, isDynamicColor = dynamicColor,
isDarkMode = DarkMode.fromId(darkMode), isDarkMode = DarkMode.fromId(darkMode),

View file

@ -2,7 +2,11 @@ package cn.super12138.todo.ui.pages.settings.components.appearance.darkmode
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@ -14,12 +18,15 @@ import cn.super12138.todo.ui.theme.DarkMode
@Composable @Composable
fun DarkModePicker( fun DarkModePicker(
currentDarkMode: DarkMode, currentDarkMode: () -> DarkMode,
onDarkModeChange: (darkMode: DarkMode) -> Unit, onDarkModeChange: (darkMode: DarkMode) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val context = LocalContext.current val context = LocalContext.current
val isInDarkTheme = isSystemInDarkTheme() val isInDarkTheme = isSystemInDarkTheme()
val darkModeList = remember { DarkMode.entries.toList() }
LazyRowSettingsItem( LazyRowSettingsItem(
title = stringResource(R.string.pref_dark_mode), title = stringResource(R.string.pref_dark_mode),
description = stringResource(R.string.pref_dark_mode_desc), description = stringResource(R.string.pref_dark_mode_desc),
@ -27,37 +34,22 @@ fun DarkModePicker(
fadedEdgeWidth = 8.dp, fadedEdgeWidth = 8.dp,
modifier = modifier modifier = modifier
) { ) {
item { items(items = darkModeList, key = { it.id }) {
DarkModeItem( val (contentColor, containerColor) = when (it) {
icon = DarkMode.FollowSystem.icon, DarkMode.FollowSystem -> if (isInDarkTheme) Color.White to Color.Black else Color.Black to Color.White
name = DarkMode.FollowSystem.getDisplayName(context), DarkMode.Light -> Color.Black to Color.White
contentColor = if (isInDarkTheme) Color.White else Color.Black, DarkMode.Dark -> Color.White to Color.Black
containerColor = if (isInDarkTheme) Color.Black else Color.White, }
selected = currentDarkMode == DarkMode.FollowSystem,
onSelect = { onDarkModeChange(DarkMode.FollowSystem) }
)
}
item { val isSelected by remember { derivedStateOf { currentDarkMode() == it } }
DarkModeItem(
icon = DarkMode.Light.icon,
name = DarkMode.Light.getDisplayName(context),
contentColor = Color.Black,
containerColor = Color.White,
selected = currentDarkMode == DarkMode.Light,
onSelect = { onDarkModeChange(DarkMode.Light) }
)
}
item {
DarkModeItem( DarkModeItem(
icon = DarkMode.Dark.icon, icon = it.icon,
name = DarkMode.Dark.getDisplayName(context), name = it.getDisplayName(context),
contentColor = Color.White, contentColor = contentColor,
containerColor = Color.Black, containerColor = containerColor,
selected = currentDarkMode == DarkMode.Dark, selected = isSelected,
onSelect = { onDarkModeChange(DarkMode.Dark) } onSelect = { onDarkModeChange(it) })
)
} }
} }
} }

View file

@ -108,7 +108,10 @@ fun PaletteItem(
Text( Text(
text = paletteStyle.getDisplayName(context), text = paletteStyle.getDisplayName(context),
style = MaterialTheme.typography.bodyMedium style = MaterialTheme.typography.bodyMedium,
color = if (selected) {
MaterialTheme.colorScheme.primary
} else MaterialTheme.colorScheme.onSurface
) )
} }
} }

View file

@ -2,7 +2,10 @@ package cn.super12138.todo.ui.pages.settings.components.appearance.palette
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@ -15,17 +18,14 @@ import cn.super12138.todo.ui.theme.PaletteStyle
@Composable @Composable
fun PalettePicker( fun PalettePicker(
currentPalette: PaletteStyle, currentPalette: () -> PaletteStyle,
onPaletteChange: (paletteStyle: PaletteStyle) -> Unit, onPaletteChange: (paletteStyle: PaletteStyle) -> Unit,
isDynamicColor: Boolean, isDynamicColor: Boolean,
isDarkMode: DarkMode, isDarkMode: DarkMode,
contrastLevel: ContrastLevel, contrastLevel: ContrastLevel,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val paletteOptions = remember { PaletteStyle.entries.toList() }
val paletteOptions = remember {
PaletteStyle.entries.toList()
}
LazyRowSettingsItem( LazyRowSettingsItem(
title = stringResource(R.string.pref_palette_style), title = stringResource(R.string.pref_palette_style),
@ -34,21 +34,21 @@ fun PalettePicker(
fadedEdgeWidth = 8.dp, fadedEdgeWidth = 8.dp,
modifier = modifier modifier = modifier
) { ) {
paletteOptions.forEach { paletteStyle -> items(items = paletteOptions, key = { it.id }) {
item { val isSelected by remember { derivedStateOf { currentPalette() == it } }
PaletteItem(
isDynamicColor = isDynamicColor, PaletteItem(
isDark = when (isDarkMode) { isDynamicColor = isDynamicColor,
DarkMode.FollowSystem -> isSystemInDarkTheme() isDark = when (isDarkMode) {
DarkMode.Light -> false DarkMode.FollowSystem -> isSystemInDarkTheme()
DarkMode.Dark -> true DarkMode.Light -> false
}, DarkMode.Dark -> true
paletteStyle = paletteStyle, },
selected = currentPalette == paletteStyle, paletteStyle = it,
contrastLevel = contrastLevel, selected = isSelected,
onSelect = { onPaletteChange(paletteStyle) } contrastLevel = contrastLevel,
) onSelect = { onPaletteChange(it) }
} )
} }
} }
} }