1、有这样一段代码
@Composable
fun BasicsCodelabTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
// Dynamic color is available on Android 12+
dynamicColor: Boolean = true,
content: @Composable () -> Unit
) {
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context)
else
dynamicLightColorScheme(context)
}
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
(view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb()
ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = darkTheme
}
}
MaterialTheme(
colorScheme = colorScheme,
typography = Typography,
content = content
)
}
说明:
该代码定义了BasicsCodelabTheme
的函数,用于设置应用的主题样式,包括颜色方案和材质设计主题。功能分解如下:
- 根据是否启用动态颜色和系统版本,选择动态颜色方案或默认颜色方案。
- 如果视图不在编辑模式下,通过
SideEffect
设置状态栏颜色和亮度模式。 - 使用
MaterialTheme
包装内容组件,提供颜色方案和 typography。
when的基本用法:
when (subject) {
condition1 -> result1
condition2 -> result2
else -> defaultResult
}
说明:
- subject:可选部分,表示要匹配的值或表达式。
- condition:每个分支的条件,可以是常量、表达式或类型检查。
- result:当对应的条件为真时执行的代码块。
- else:默认分支,当没有条件匹配时执行。
代码片段中的when:
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context)
else dynamicLightColorScheme(context)
}
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
说明:
无 subject 的 when:
这里的 when 没有指定 subject,而是直接通过条件表达式来判断。
每个条件是一个布尔表达式,只有当条件为 true 时,对应的代码块才会执行。
条件分支:
第一个条件:dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
如果动态颜色启用 (dynamicColor) 且系统版本支持动态颜色 (Android 12+),则根据 darkTheme 的值选择动态深色或浅色方案。
第二个条件:darkTheme
如果当前主题是深色模式,则使用默认深色方案 (DarkColorScheme)。
默认分支:else
如果以上条件都不满足,则使用默认浅色方案 (LightColorScheme)。
返回值:
when 表达式的每个分支都会返回一个值,最终 colorScheme 被赋值为匹配条件的结果。