【发布时间】:2021-09-05 05:48:49
【问题描述】:
我习惯于在特定应用程序变体中覆盖 XML 资源的值,但在 jetpack compose 中我不能再这样做了,所以我想知道在完全不使用任何 XML 的情况下,哪个是新库的好方法。
我的主题位于一个模块中,该模块对应用程序变体一无所知,我希望它保持不变。这意味着我无法为每个变体创建 AppVariantColors 类,因为我无法引用它。
我应该将调色板传递给可组合的主题吗?
编辑:我现在正在做的事情如下:
首先我定义了一个带有一组颜色变体的调色板类,然后我将在实际变体中使用:
enum class AppColorPalette {
DARK_BLUE,
DARK_RED,
LIGHT_BLUE,
LIGHT_RED
}
然后我通过调色板创建一个应用程序主题
@Composable
fun AppTheme(
dims: AppDims = appDims(),
palette: AppColorPalette = AppColorPalette.DARK_BLUE,
colors: AppColors = appColors(colorPalette = palette),
typography: AppTypography = appTypography(colors, dims),
shapes: AppShapes = appShapes(),
content: @Composable () -> Unit,
) {
CompositionLocalProvider(
LocalAppColors provides colors,
LocalAppDims provides dims,
LocalAppShapes provides shapes,
LocalAppTypography provides typography,
) {
MaterialTheme(
colors = colors.materialColors,
typography = typography.materialTypography,
shapes = shapes.materialShapes,
content = content,
)
}
}
最后我创建了基于调色板可组合的应用颜色
@Composable
fun appColors(colorPalette: AppColorPalette): AppColors = when (colorPalette) {
AppColorPalette.DARK_BLUE -> darkAppColorsBlueVariant
...
}
颜色的定义如下:
private val darkAppColorsBlueVariant = darkAppColors.copy(
highEmphasis = AppColorsPalette.WhiteA100,
midEmphasis = AppColorsPalette.WhiteA50,
materialColors = darkColors(
primary = AppColorsPalette.DarkGrey900,
)
)
基本上这样做我可以使用 BuildConfig 方法,只需根据主题选择颜色变体
【问题讨论】:
-
你目前的方法有什么问题?
标签: android android-jetpack-compose