Compose CompositionLocal Navigation + ThemeBuilder + Compiler Logs

Compose Navigation, ThemeBuilder Architecture, IR Logs

1. Navigation과 CompositionLocal

Graph-level Provider

CompositionLocalProvider(LocalSession provides session) {
    NavHost(...)
}

Screen-level Override

composable("settings") {
    CompositionLocalProvider(LocalLocale provides localeKR) {
        SettingsScreen()
    }
}

BackStackEntry는 해당 CompositionLocal 스코프까지 보존함.
Back navigation restores previous CompositionLocal environments.


2. App-wide ThemeBuilder Pattern

구조

theme/
  ThemeBuilder.kt
  Color.kt
  Typography.kt
  Spacing.kt
  Elevation.kt
  LocaleConfig.kt

ThemeBuilder 구현 예시

@Composable
fun AppTheme(
    darkTheme: Boolean,
    locale: LocaleConfig,
    content: @Composable () -> Unit
) {
    CompositionLocalProvider(
        LocalLocaleConfig provides locale,
        LocalSpacing provides Spacing(),
        LocalElevation provides Elevation()
    ) {
        MaterialTheme(
            colorScheme = if (darkTheme) DarkColors else LightColors,
            typography = AppTypography,
            content = content
        )
    }
}

3. Compiler IR Dump 예시

로컬 값을 읽는 부분의 IR dump 형태 예시:
Example IR dump:

%tmp0 = call %composer.consume(LocalSpacing)
store %tmp0 → local variable

CompositionLocalProvider의 IR:

%composer.startReplaceableGroup(key)
%composer.updateProvider(LocalLocaleConfig, value)
invoke children
%composer.endReplaceableGroup()

IR dump는 내부 동작 추적과 성능 최적화 분석에 유용하다.