Composition#setContent
override fun setContent(content: @Composable () -> Unit) {
val wasDeactivated = clearDeactivated()
ensureRunning()
if (wasDeactivated) {
composeInitialWithReuse(content)
} else {
composeInitial(content)
}
}
private fun composeInitial(content: @Composable () -> Unit) {
this.composable = content
parent.composeInitial(this, composable)
}
composeInitial호출을 상위 요소에 위임하기 위해 항상 Recomposer에 의존함
parent.composeInitial은 recomposer.composeInitial로 변환될 수 있음Recomposer#composeInitial (초기 Composition 순서)
internal override fun composeInitial(
composition: ControlledComposition,
content: @Composable () -> Unit,
) {
val composerWasComposing = composition.isComposing
val newComposition =
synchronized(stateLock) {
if (_state.value > State.ShuttingDown) {
val new = composition !in knownCompositionsLocked()
if (new) {
registerCompositionLocked(composition)
}
new
} else {
true
}
}
try {
composing(composition, null) { composition.composeContent(content) }
} catch (e: Throwable) {
if (newComposition) {
synchronized(stateLock) { unregisterCompositionLocked(composition) }
}
processCompositionError(e, composition, recoverable = true)
return
}
synchronized(stateLock) {
if (_state.value > State.ShuttingDown) {
if (composition !in knownCompositionsLocked()) {
addKnownCompositionLocked(composition)
}
} else {
unregisterCompositionLocked(composition)
}
}
// TODO(b/143755743)
if (!composerWasComposing) {
Snapshot.notifyObjectsInitialized()
}
try {
performInitialMovableContentInserts(composition)
} catch (e: Throwable) {
processCompositionError(e, composition, recoverable = true)
return
}
try {
composition.applyChanges()
composition.applyLateChanges()
} catch (e: Throwable) {
processCompositionError(e)
return
}
if (!composerWasComposing) {
// Ensure that any state objects created during applyChanges are seen as changed
// if modified after this call.
Snapshot.notifyObjectsInitialized()
}
}
private inline fun <T> composing(
composition: ControlledComposition,
modifiedValues: MutableScatterSet<Any>?,
block: () -> T,
): T {
val snapshot =
Snapshot.takeMutableSnapshot(
readObserverOf(composition),
writeObserverOf(composition, modifiedValues),
)
try {
return snapshot.enter(block)
} finally {
applyAndCheck(snapshot)
}
}
snapshot.enter의 block에서만 수정 가능)snapshot.apply를 통해 변경사항 전파Composer에 위임된 실제 Composition 과정
isComposing = true로 세팅해 시작 대기startRoot 호출을 통해 Composition을 시작
startGroup)endGroup 호출endRoot 호출하여 Composition 종료isComposing = false로 세팅해 Composition 완료