主题
基于 Compose Material 3 的浅色、深色和跟随系统主题。
Kotlin 模板使用 Compose Material 3:自定义 light/dark color schemes、DataStore 持久化主题选择、 可选 Material You dynamic color,以及跟随当前主题的 edge-to-edge system bars。
提供什么
| Surface | 状态 | 实现 |
|---|---|---|
| Theme modes | Integrated | AppTheme.Light、Dark、System |
| 持久化 | Integrated | DataStore keys theme_tag 和 dynamic_color_enabled |
| Material 3 scheme | Integrated | SoarStarterKotlinTheme 包裹 MaterialTheme |
| Dynamic color | Integrated | Android 12+ 且启用后可用;默认关闭 |
| System bars | Integrated | MainActivity.ApplySystemBarTheme() 更新 SystemBarStyle |
关键文件
主题选择
AppTheme 保存三种模式:
Light("light")
Dark("dark")
System("system")ThemeController 把 DataStore 的 theme_tag 映射为 StateFlow<AppTheme>,并把
dynamic_color_enabled 映射为 StateFlow<Boolean>。MainActivity 根据
isSystemInDarkTheme() 解析当前模式,然后把两个值传入 SoarStarterKotlinTheme。
Drawer 和 Component gallery 都复用 ThemeToggle,这是一个在 System、Light、Dark 之间切换的
segmented Compose control。
颜色系统
Color.kt 定义:
- iOS 风格 accent 和 semantic colors,包括
IosTint、IosDestructive、IosGreen、IosIndigo、IosOrange。 - light/dark 的 background、foreground、muted、border、input、ring 基础颜色。
ColorSchemeextension properties,例如groupedBackground、groupedSurface、groupedInput、labelSecondary、separatorSoft、tint。
Theme.kt 用这些 tokens 构建明确的 Material 3 light/dark schemes。如果 dynamic color 启用且设备是
Android 12 或更高,dynamicLightColorScheme() / dynamicDarkColorScheme() 会替代自定义 scheme。
Dynamic color 已实现、已持久化,也传入了 root theme,但默认存储值是 false。如果希望用户使用
Material You 行为,请从你的 settings UI 暴露开关。
字体
Type.kt 自定义 Material 3 typography scale:使用 Android 默认字体、semibold/bold headings,
并设置 letterSpacing = 0.sp。Screens 应使用 MaterialTheme.typography,不要硬编码字号。
Edge-to-edge
MainActivity 调用 enableEdgeToEdge(),并根据解析后的主题使用 SystemBarStyle.dark() 或
SystemBarStyle.light()。这样用户切换主题时 status/navigation bar icons 仍保持可读。
大多数 screen background 使用 MaterialTheme.colorScheme.groupedBackground,保持 starter 的
grouped mobile settings 风格。
Rebrand checklist
- 替换
Color.kt中的IosTint和相关 semantic colors。 - 调整
Theme.kt中的 light/dark color schemes。 - 如果品牌使用 custom font,修改
Type.kt。 - 替换
res/drawable、res/mipmap-*、res/mipmap-anydpi下的 launcher assets。 - 更新
strings.xml中的app_name。 - 创建真实产品 fork 时,修改
applicationId、namespace 和所有 Play/App Links identifiers。 - 修改 package name 后,重新检查
LINKING_DOMAIN、assetlinks.json、release signing、Firebase 和 RevenueCat。
验证
- 主题选择在进程重启后仍保留。
- System mode 跟随设备 dark-mode 设置。
- Dynamic color 只在 Android 12+ 且启用后改变 scheme。
- Light/dark 下 status 和 navigation bar icons 都保持可读。
- Launcher icons、display name、package name、App Links 都匹配 rebranded app。
