Motywy w Jetpack Compose składają się z wielu konstrukcji niższego poziomu i powiązanych interfejsów API. Można je zobaczyć w kodzie źródłowym aplikacji MaterialTheme i można je też stosować w niestandardowych systemach projektowania.
Klasy systemu motywów
Motyw zwykle składa się z kilku podsystemów, które grupują wspólne koncepcje wizualne i behawioralne. Te systemy można modelować za pomocą klas, które mają wartości motywów.
Na przykład MaterialTheme obejmuje ColorScheme (system kolorów), Typography (system typografii) i Shapes (system kształtów).
@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 /* ... */ ) /* ... */
Lokalne kompozycje systemu motywów
Klasy systemu motywów są domyślnie dostarczane do drzewa kompozycji jako instancje CompositionLocal. Dzięki temu wartości motywu mogą być statycznie przywoływane w funkcjach typu „composable”.
Więcej informacji o CompositionLocal znajdziesz w przewodniku po danych o zasięgu lokalnym z 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 = "" ) } /* ... */
Funkcja motywu
Funkcja motywu to punkt wejścia i główny interfejs API. Tworzy instancje systemu motywów CompositionLocals, używając rzeczywistych wartości i wymaganej logiki, które są dostarczane do drzewa kompozycji za pomocą CompositionLocalProvider.
Parametr content umożliwia zagnieżdżonym elementom kompozycyjnym dostęp do wartości motywów względem hierarchii.
@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 ) }
Obiekt motywu
Dostęp do systemów motywów uzyskuje się za pomocą obiektu z wygodnymi właściwościami. Dla zachowania spójności obiekt ma zwykle taką samą nazwę jak funkcja motywu. Właściwości po prostu pobierają bieżący element lokalny kompozycji.
// 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 /* ... */ }
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy język JavaScript jest wyłączony.
- Dane o zasięgu lokalnym z CompositionLocal
- Niestandardowe systemy projektowania w Compose
- Material Design 3 w Compose