Я работаю над системой дизайна с Jetpack Compose, у меня есть много компонентов, использующих мою тему для доступа к цветам, типографике и размерам. Сейчас рассматриваю возможность настройки. Например, переопределение цвета приводит к его изменению для каждого компонента.
До сих пор я пытался добавить параметры в забавную MyTheme. У меня был некоторый успех с этим подходом, но проблема в том, что любой разработчик может изменить тему в любое время, как это. Я хотел бы, чтобы его можно было настроить только один раз, может быть, как синглтон. Любые идеи или рекомендации?
Вот моя тема:
private val LightColorPalette = LightColors()
private val DarkColorPalette = DarkColors()
private val LocalColors = compositionLocalOf<MyColors> {
error("No typography provided! Make sure to wrap all usages of this components in a MyTheme.")
}
private val LocalTypography = compositionLocalOf<MyTypography> {
error("No typography provided! Make sure to wrap all usages of this components in a MyTheme.")
}
private val LocalDimensions = staticCompositionLocalOf { MyDimensions() }
@Composable
fun MyTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
colors: MyColors = if (darkTheme) DarkColorPalette else LightColorPalette,
typography: MyTypography = getTypography(LocalConfiguration.current),
dimensions: MyDimensions = getDimensions(LocalConfiguration.current),
content: @Composable () -> Unit
) {
val shapes = MaterialShapes
CompositionLocalProvider(
LocalTypography provides typography,
LocalColors provides colors,
LocalDimensions provides dimensions,
) {
MaterialTheme(
colors = debugColors(darkTheme),
content = content,
shapes = shapes
)
}
}
Мне удалось заставить это работать, сделав все мои переменные CompositionLocal общедоступными. При этом любая новая тема, которая переопределяет эти переменные с помощью CompositionLocalProvider, будет иметь под собой составные объекты, использующие эти новые значения.
@Composable
fun SecondaryTheme(
content: @Composable () -> Unit
) {
val configuration = LocalConfiguration.current
val colors = SecondaryColors()
val typography = getDefaultTypography(configuration)
val dimensions = getDefaultDimensions(configuration)
val shapes = MaterialShapes
CompositionLocalProvider(
LocalTypography provides typography,
LocalColors provides colors,
LocalDimensions provides dimensions,
) {
MaterialTheme(
colors = materialColors(darkTheme),
content = content,
shapes = shapes
)
}
}
Рекомендую ознакомиться с официальной документацией
Я считаю, что следующая документация страница говорит именно об этом.