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의 맞춤 디자인 시스템
- Compose의 Material Design 3