Anatomia di un tema in Scrivi

I temi in Jetpack Compose sono costituiti da una serie di costrutti di livello inferiore e API correlate. Questi possono essere visualizzati nel codice sorgente di MaterialTheme e possono essere applicati anche nei sistemi di progettazione personalizzati.

Classi di sistema dei temi

Un tema è in genere composto da una serie di sottosistemi che raggruppano concetti visivi e comportamentali comuni. Questi sistemi possono essere modellati con classi che hanno valori di temi.

Ad esempio, MaterialTheme include ColorScheme (sistema di colori), Typography (sistema tipografico) e Shapes (sistema di forme).

@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
    /* ... */
)

/* ... */

Theme system composition locals

Le classi di sistema del tema vengono fornite implicitamente all'albero di composizione come istanze di CompositionLocal. Ciò consente di fare riferimento staticamente ai valori dei temi nelle funzioni componibili.

Per scoprire di più su CompositionLocal, consulta la guida Dati con ambito locale con 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 = ""
    )
}

/* ... */

Funzione del tema

La funzione del tema è l'entry point e l'API principale. Costruisce istanze del sistema di temi CompositionLocals, utilizzando valori reali e qualsiasi logica richiesta, che vengono fornite all'albero di composizione con CompositionLocalProvider. Il parametro content consente ai composable nidificati di accedere ai valori dei temi relativi alla gerarchia.

@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
    )
}

Oggetto tema

L'accesso ai sistemi di temi viene eseguito utilizzando un oggetto con proprietà di convenienza. Per coerenza, l'oggetto tende ad avere lo stesso nome della funzione del tema. Le proprietà ottengono semplicemente la composizione locale corrente.

// 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
    /* ... */
}