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
MaterialTheme i zastosować 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 zawiera
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ą niejawnie udostępniane w drzewie kompozycji jako
CompositionLocal
instancje. Dzięki temu wartości motywów można statycznie odwoływać się w funkcjach kompozycyjnych.
Więcej informacji o CompositionLocal znajdziesz w
przewodniku Dane 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 jest punktem wejścia i głównym interfejsem API. Tworzy instancje
systemu motywów CompositionLocal – przy użyciu rzeczywistych wartości i wymaganej logiki
– które są udostępniane w drzewie kompozycji za pomocą
CompositionLocalProvider.
Parametr content umożliwia zagnieżdżonym elementom kompozycyjnym dostęp do wartości motywów w odniesieniu do 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 odbywa się za pomocą obiektu z właściwościami ułatwiającymi korzystanie. Dla zachowania spójności obiekt zwykle ma taką samą nazwę jak funkcja motywu. Właściwości po prostu pobierają bieżącą kompozycję lokalną.
// 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