Темы в Jetpack Compose состоят из ряда конструкций более низкого уровня и связанных API. Их можно посмотреть в исходном коде MaterialTheme и использовать в собственных системах проектирования.
Системные классы тем
Тема обычно состоит из нескольких подсистем, которые группируют общие визуальные и поведенческие концепции. Эти системы можно смоделировать с помощью классов, которые имеют значения тем.
Например, MaterialTheme включает ColorScheme (система цветов), Typography (система типографики) и Shapes (система форм).
@Immutable data class ColorSystem( val color: Color, val gradient: List<Color> /* ... */ ) @Immutable data class TypographySystem( val fontFamily: FontFamily, val textStyle: TextStyle ) /* ... */ @Immutable data class CustomSystem( val value1: Int, val value2: String /* ... */ ) /* ... */
Локальные переменные для композиции системных тем
Классы системных тем неявно предоставляются дереву композиции как экземпляры CompositionLocal. Это позволяет статически ссылаться на значения тем в composable-функциях.
Чтобы узнать больше о CompositionLocal, ознакомьтесь с руководством Локальные данные с CompositionLocal.
val LocalColorSystem = staticCompositionLocalOf { ColorSystem( color = Color.Unspecified, gradient = emptyList() ) } val LocalTypographySystem = staticCompositionLocalOf { TypographySystem( fontFamily = FontFamily.Default, textStyle = TextStyle.Default ) } val LocalCustomSystem = staticCompositionLocalOf { CustomSystem( value1 = 0, value2 = "" ) } /* ... */
Функция темы
Функция темы – это точка входа и основной API. Она создает экземпляры CompositionLocals системы тем, используя реальные значения и любую необходимую логику, которые предоставляются дереву композиции с помощью CompositionLocalProvider.
Параметр content позволяет вложенным composable-функциям получать доступ к значениям темы, связанным с иерархией.
@Composable fun Theme( /* ... */ content: @Composable () -> Unit ) { val colorSystem = ColorSystem( color = Color(0xFF3DDC84), gradient = listOf(Color.White, Color(0xFFD7EFFF)) ) val typographySystem = TypographySystem( fontFamily = FontFamily.Monospace, textStyle = TextStyle(fontSize = 18.sp) ) val customSystem = CustomSystem( value1 = 1000, value2 = "Custom system" ) /* ... */ CompositionLocalProvider( LocalColorSystem provides colorSystem, LocalTypographySystem provides typographySystem, LocalCustomSystem provides customSystem, /* ... */ content = content ) }
Объект темы
Доступ к системам тем осуществляется с помощью объекта с удобными свойствами. Для единообразия объекту обычно присваивается то же имя, что и функции темы. Свойства просто получают текущую локаль композиции.
// Use with eg. Theme.colorSystem.color object Theme { val colorSystem: ColorSystem @Composable get() = LocalColorSystem.current val typographySystem: TypographySystem @Composable get() = LocalTypographySystem.current val customSystem: CustomSystem @Composable get() = LocalCustomSystem.current /* ... */ }
Рекомендуем
- Примечание. Текст ссылки показывается, когда JavaScript отключен.
- Локальные данные с CompositionLocal
- Специальные системы проектирования в Compose
- Material Design 3 в Compose