전체 글
[Android] Compose UI - (3)
UI 변경 사항 반영하기composition과 후속으로 이루어지는 recomposition의 과정을 거치면서 발생되는 모든 변경사항들은 실제 UI에 반영하여 상용자가 경험할 수 있도록 하는 통합 과정이 필요하다.이 과정은 흔히 노드 트리의 구체화라고 불리며 Compose UI와 같은 클라이언트단의 라이브러리의 책임이다.다양한 타입의 Applier들Applier는 라이브러리가 사용되는 플랫폼에 대해 런타임이 완전히 알지는 못하도록 의존성을 반전시킨다.이 추상화 계층은 Compose UI와 같은 클라이언트 라이브러리가 자체적으로 Applier 구현을 할 수 있도록 하기 위해 플랫폼과의 통합에 사용될 자신의 노드 타입을 선택하게 된다.Compose Runtime에서 다양한 Applier들이 공통 로직을 공유하..
[Android] Compose UI - (2)
Compose UI 관점에서의 SubCompositionComposition은 루트 레벨 외에도 Composable 트리의 더 깊은 수준에서 생성될 수 있으며, 부모 Composition과 연결될 수도 있다.이러한 특성을 Subcomposition이라고 한다.각각의 모든 Composition은 부모의 Composition을 나타내는 부모의 CompositionContext에 대한 참조를 가지고 있으며 Compose UI에서 Subcomposition을 생성하는 이유는 크게 2가지가 있다.초기 composition 과정에서 특정 정보를 알 때까지 지연하기 위해하위 트리에서 생성되는 노드 타입 변경을 위해 초기 Composition 과정의 지연SubcomposeLayout은 Layout과 유사하지만 레이아웃..
[Android] Compose UI - (1)
Compose UI와 런타임의 통합Compose Runtime을 위한 클라이언트 라이브러리로써 Compose UI를 결합하는 이유는 사용자가 보게될 화면의 레이아웃 트리를 구축하기 위해서이다.이 트리는 Composable 함수를 실행함으로써 만들어지고, 트리에 사용되는 노드 타입은 Compose UI만 알고 있기 때문에 런타임은 이를 알지 못한다.Compose UI와 같은 클라이언트 라이브러리에서 생성하는 노드 타입은 클라이언트 라이브러리만 알고 있어야 하기 때문에, 런타임은 트리에서 노드를 삽입, 삭제, 이동 또는 교체 작업을 위임한다.예약된 변경 목록을 실제 트리의 변경 목록으로 매핑Composition이나 recomposition에 의해 Composable 함수가 자신의 변경 사항을 방출할 때 co..
[Android] Compose 런타임 - (12)
Recomposer 생성Compostion을 생성할 때에는 해당 composition에 대한 부모를 함께 제공해야 한다.따라서, root composition의 부모가 Recomposer가 되어야 하는 경우 Recomposer를 생성해야 하는 상황이 생기기도 한다.Android의 ViewGroup에서 Compose를 사용하려면 ViewGroup.setContent()를 호출하며, 궁극적으로 몇 가지 과정을 우회하여 아래의 코드와 같이 Recomposer 팩토리에게 상위 콘텍스트 생성 작업을 위임한다.fun interface WindowRecomposerFactory { fun createRecomposer(windowRootView: View): Recomposer companion object { ..
[Android] Compose 런타임 - (11)
초기 Composition 과정새로운 composition이 생성될 때마다 setContent()가 호출되며, 이 호출은 초기 상태의 composition 프로세스를 시작하기 위해 상위 composition에 위임된다.override fun setContent(content: @Composable () -> Unit) { this.composable = content parent.composeInitial(this, composable)}초기 composition을 수행하는 로직은 항상 recomposer에 의존하게 된다.이는 하위 composition은 루트 composition에 도달할 때까지 지속적으로 composeInitial 호출을 상위 요소에 위임하기 때문이다.따라서 parent.compose..
[Android] Compose 런타임 - (10)
Composition 생성하기Android의 경우 ViewGroup이나 setContent 호출을 통해 새로운 composition을 생성할 수 있다.internal fun ViewGroup.setContent( parent: CompositionContext, contnet: @Composable () -> Unit): Composition { val composeView = ... return doSetContent(composeView, parent, content)}private fun doSetContent( owner: AndroidComposeView, parent: CompositionContext, contnet: @Composable () -> Unit): Composition { va..