Subcomposition 생성 : 초기 Composition 과정의 지연을 위해
SubcomposeLayout
자식 Composable이 SubcomposeLayout 안에서 measure된 값에 의존하도록 레이아웃 단계에서 독립적인 Composition 생성, 실행
e.g. BoxWithConstraints
BoxWithConstraints {
val rectangleHeight = 100.dp
if (maxHeight < rectangleHeight * 2) {
Box(Modifier.size(50.dp, rectangleHeight).background(Color.Blue))
} else {
Column {
Box(Modifier.size(50.dp, rectangleHeight).background(Color.Blue))
Box(Modifier.size(50.dp, rectangleHeight).background(Color.Gray))
}
}
}
Subcomposition과 SubcomposeLayout 비교
같은 Composition에서 다른 노드 타입 지원이 가능한가?
Subcomposition 생성 : 서브 트리의 노드 타입 변경을 위해
e.g. rememberVectorPainter
@Composable
fun MenuButton(onMenuClick: () -> Unit) {
Icon(
painter = rememberVectorPainter(image = Icons.Rounded.Menu),
contentDescription = "Menu Button",
modifier = Modifier.clickable { onMenuClick() }
)
}

Applier는 트리에 대한 런타임의 변경 사항을 구체화 하기 위해 사용되는 추상화
의존성 반전을 통해 클라이언트 라이브러리가 자체적인 Applier 구현을 할 수 있게 함
플랫폼과의 통합을 위해 사용될 노드 타입을 Compose UI에서 자체적으로 선택

// Compose Runtime
public abstract class AbstractApplier<T>(
public val root: T
) : Applier<T> { .. }
// Compose Ui
internal class UiApplier(
root: LayoutNode
) : AbstractApplier<LayoutNode>(root) { .. }
class VectorApplier(root: VNode) : AbstractApplier<VNode>(root) { .. }
AbstractApplier
특징 : 다양한 Applier간 공통 로직을 공유하기 위해 Compose Runtime에서 제공되는 기본 구현
구현 :
자식 Applier와의 관계 :
e.g. condition에 따른 Applier 동작
@Composable
fun Sample() { // 1.
Column { // 2. 5.
Row { // 3. 4.
Text("Some Text")
if (condition) {
Text("Some conditional text")
}
}
if (condition) {
Text("Some more conditional text")
}
}
}
UiApplier
목적 : 안드로이드 UI 렌더링
사용 노드 타입 : LayoutNode 고정
트리 구축 방식 : 상향식 트리 구축 (상향식 삽입)

VectorApplier
목적 : 벡터 그래픽 렌더링
사용 노드 타입 : VNode 고정
트리 구축 방식 : 하향식 트리 구축 (하향식 삽입)
