Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Compose: Beyond Android

Avatar for Bruno Aybar Bruno Aybar
November 14, 2025
5

Compose: Beyond Android

Jetpack Compose is more than just a modern UI toolkit for Android ; it's a powerful declarative framework built on a platform-agnostic foundation . The true magic lies in its decoupled compiler and runtime.

This session dives deep into these core components. We will explore:
- The Runtime: How compose.runtime manages state (MutableState) , tracks changes (Snapshot) , and executes UI updates (Composer and Recomposer).
- The Compiler: How the compose.compiler (a Kotlin Compiler Plugin) transforms your @Composable functions, injecting the necessary code to enable recomposition .

By understanding this fundamental separation, attendees will see how the same core logic that powers our Android apps is now enabling Compose on new platforms, including Compose for TV and Compose Multiplatform for iOS and Desktop.

Avatar for Bruno Aybar

Bruno Aybar

November 14, 2025
Tweet

Transcript

  1. Bruno Aybar Senior Engineer, Shopify Organizer, Android Dev Peru 


    
 Twitter: @brunoaybarg 
 Github: @Bruno125 Expositor
  2. @Composable fun ItemRow(item: Item) { Row { Image(imageResource(item.image)) Column {

    Text(item.title) Text(item.description) } } } Usando Compose
  3. 1.Solución 100% orientada a Kotlin 
 Usando Compose @Composable fun

    ItemRow(item: Item) { Row { Image(imageResource(item.image)) Column { Text(item.title) Text(item.description) } } }
  4. 1.Solución 100% orientada a Kotlin 
 2.UI declarativa, basada en

    @Composables Usando Compose @Composable fun ItemRow(item: Item) { Row { Image(imageResource(item.image)) Column { Text(item.title) Text(item.description) } } }
  5. @Composable fun ItemRow(item: Item) { Row { Image(imageResource(item.image)) Column {

    Text(item.title) Text(item.description) } } } @Composables Usando Compose
  6. @Composable @Preview fun SurveyAnswer(answer: Answer) { Row { Image(answer.image) Text(answer.text)

    RadioButton(selected = false, onClick = { /* … */ }) } } compose.foundation compose.material compose.material3 compose.ui
  7. compose.ui compose.foundation compose.material Modifier Layout LayoutNode FocusManager Alpha / Blur

    / Scale ... Box Column Row Size Padding ... Text Button Snackbar Card Scaffold ...
  8. Recomposición Los elementos de UI necesitan volver a renderizarse bajo

    distintas circunstancias (ej. cuando los estados mutan)
  9. @Composable fun Counter() { val count = remember { mutableStateOf(0)

    } Button( onClick = { count.value += 1 }, content = { Text("value: ${count.value}") } ) }
  10. @Composable MutableState Snapshot actualiza value registra el cambio Write 


    Observer Write 
 Observer Write 
 Observer Write 
 Observer notify notify notify notify @Composable MutableState @Composable MutableState
  11. Write 
 Observer Write 
 Observer Write 
 Observer Write

    
 Observer notify notify notify notify Snapshot
  12. class Recomposer(...) { ... suspend fun recomposeAndApplyChanges(...) { ... val

    observer = Snapshot.registerApplyObserver { changed, _ -> appliedChanges.offer(changed) } } ... }
  13. setContent { ...} Composition crea (o accede a) un crea

    (o accede a) un se adhiere al padre AndroidOwner
 (AndroidComposeView)
  14. SlotTable Composer tiene un tiene un Composition
 (CompositionImpl) 1. Realiza

    cambios (basados en positional memoization) sobre el SlotTable. 2. Coordina el "ciclo de vida” de un Composable (onEnter / onLeave) 3. Decide cómo actuar en base a cambios ocurridos en algún otro lugar.
  15. SlotTable Composer tiene un tiene un Composition
 (CompositionImpl) 1. Realiza

    cambios (basados en positional memoization) sobre el SlotTable. 2. Coordina el "ciclo de vida” de un Composable (onEnter / onLeave) 3. Decide cómo actuar en base a cambios ocurridos en algún otro lugar.
  16. Snapshot Recomposer Composer MutableState registra el cam bio noti fi

    ca cambios avisa que una 
 recomposición podría ser necesaria
  17. @Composable fun ItemRow(item: Item) { Row { Image(imageResource(item.image)) Column {

    Text(item.title) Text(item.description) } } } ItemRow Row Image Column Text Text
  18. Compose Runtime La recomposición no es ✨ magia✨ Registra los

    cambios de estado en 
 tiempo de ejecución (Snapshot) Ejecuta las recomposiciones que 
 hagan falta, en base a los cambios 
 pendientes (Composer) 1 2 3
  19. Kotlin Compiler Plugins pueden… Modificar la representación interna 
 (IR)

    del código Generar nuevas clases Realizar static-analysis del código 1 2 3
  20. * 3. Composable Function Skipping * 4. Comparison Propagation *

    5. Recomposability * 6. Source location information (when enabled) */ class ComposableFunctionBodyTransformer( context: IrPluginContext, … ) : { } Android Code Search
  21. /** * This IR Transform is responsible for the main

    transformations of the body of a composable * function. * * 1. Control-Flow Group Generation * 2. Default arguments * 3. Composable Function Skipping * 4. Comparison Propagation * 5. Recomposability * 6. Source location information (when enabled) */ class ComposableFunctionBodyTransformer( context: IrPluginContext, … ) : { }
  22. Compose Runtime La recomposición no es ✨ magia✨ Registra los

    cambios de estado en 
 tiempo de ejecución (Snapshot) Ejecuta las recomposiciones que 
 hagan falta, en base a los cambios 
 pendientes (Composer) 1 2 3
  23. /** * An Applier is responsible for applying the tree-based

    * operations that get emitted during a composition. * Every [Composer] has an [Applier] which it * uses to emit a [ComposeNode]. * */ interface Applier<N> { … }
  24. Bruno Aybar Senior Engineer @ Shopify Mentor @ DeepSkill, Talently

    
 
 Twitter: @brunoaybarg 
 Github: @Bruno125 Gracias!