Темы в 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. Это позволяет статически ссылаться на значения тем в функциях, которые можно компоновать.
Чтобы узнать больше о 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. Он создает экземпляры системной темы CompositionLocal, используя реальные значения и любую необходимую логику, которые передаются в дерево композиции с помощью CompositionLocalProvider.
Параметр content позволяет вложенным композициям получать доступ к значениям тем относительно иерархии.
@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