재구성 범위
재시작 가능한 그룹이 생성될 때마다, Composer는 이에 대한 RecomposeScope를 생성하고 이를 Composition에 대한 currentRecomposeScope로 설정한다.
(재시작 가능한 그룹의 범위 = RecomposeScope)
RecomposeScope는 composition의 영역을 모델링하는데 Composable의 recompositon을 수동으로 invalidate 하고 트리거하는 데 사용할 수 있다.
invalidate는 composer.currentRecomposeScope(). invalidate()와 같이 Composer를 통해 호출되고 재구성을 위해 Composer는 슬롯 테이블을 해당 그룹의 시작 위치에 배치한 다음 람다에 전달된 재구성 블록을 호출한다.
그러면 Composable 함수가 호출되면서 한 번 더 방출되므로 Composer가 테이블의 기존 데이터를 재정의 하도록 한다.
Composer는 invalidate 된 모든 재구성 범위를 스택의 형태로 유지되며 currentRecomposeScope는 이 재구성 범위의 스택을 통해 생성된다.
이렇게 쌓여있는 범위들은 보류 중인 상태를 의미하며 다음 recompostion에서 트리거 되어야 한다.
RecomposeScope는 Compose가 Composable 함수 내의 상태 스냅샷에서 읽기와 관련된 작업을 발견했을 경우에만 활성화된다.
이 경우 Composer는 RecomposeCope를 used로 표시하고, 함수 끝에 위치한 endRestartGroup()의 호출값이 더 이상 null을 반환하지 않고 이어진 람다를 수행한다.
말로설명하고 이해하긴 어려우니 코드도 함께 살펴보자.
@Composable
fun A(x: Int, $composer: Composer<*>, $changed: Int) {
$composer.startRestartGroup()
// ...
f(x)
$composer.endRestartGroup()?.updateScope { next ‐>
A(x, next, $changed or 0b1)
}
}
CompositionLocals, 소스 정보 저장
Composer는 CompositionLocals를 등록하고 키를 통해 해당 값을 획득하는 방법을 제공한다.
즉 CompositionLocals는 상태를 제공하는 일종의 컨테이너와 같은 역할을 한다.
그렇기에 컴포저블 트리 상위에서 선언된 상태를 하위에서 접근할 수 있는 방법을 제공할 수 있다.
CompositionLocal.current 호출은 이에 의존하게 되며 CompositionLocals의 Provider와 제공되는 값은 모두 슬롯 테이블에 하나의 그룹 형태로 저장된다.
또한 Composer는 각종 Compose의 틀에서 활용할 수 있도록 composition 중에 수집된 내용을 CompositionData 형태로 소스 정보를 저장한다.
CompositionContext를 통한 Composition 연결
CompositionContext는 composition과 subcomposition을 하나의 트리로 연결하기 위해 존재하며,
하위 Composition은 상위 Composition Context를 참조하여 상위 composition과 연결할 수 있다.
이러한 구성으로 CompositionLocal과 invalidatation이 마치 단일 composition에 속한 것처럼 투명하게 트리 아래로 전파되는 것을 보장한다.
Subcomposition을 생성하는 것은 일반적으로 rememberCompositionContext를 통해 이루어진다.
@Composable fun rememberCompositionContext(): CompositionContext {
return currentComposer.buildContext()
}
위 함수는 슬롯 테이블에 기록된 현재 위치에 새 composition의 정보를 등록하거나, 이미 등록되어 있다면 동일한 정보를 반환한다.
이는 VectorPainter, Dialog, SubcomposeLayout, Popup과 같이 별도의 composition이 필요한 위치에서 subcomposition을 만드는 데 사용된다.
'Android' 카테고리의 다른 글
[Android] Compose 런타임 - (7) (0) | 2024.12.03 |
---|---|
[Android] Compose 런타임 - (6) (0) | 2024.12.02 |
[Android] Compose 런타임 - (4) (0) | 2024.11.28 |
[Android] Compose 런타임 - (3) (0) | 2024.11.27 |
[Android] Compose 런타임 - (2) (0) | 2024.11.26 |