반응형
- 기존의 XML 화면에서 Compose 기반 컴포넌트 활용을 위해 ComposeView를 사용하고 있었다.
<androidx.compose.ui.platform.ComposeView
android:id="@+id/mainAddBtn"
android:layout_width="52dp"
android:layout_height="52dp"
android:layout_gravity="right|bottom" />
- 그리고 인앱 지정 컬러를 변경할 때마다 ComposeView에 걸린 컴포저블의 tint도 변경을 해줘야 했는데, 프로퍼티로 들어가는 속성 값은 변경되지만 실제 컴포저블 set 로직까지는 진입이 안 되는 것을 확인했다.
mainAddBtn.setContent {
TbFloatingActionButton(
androidx.compose.ui.graphics.Color(AppColor()),
...
- 이유는 setContent {} 자체가 최초 한 번만 컴포지션을 설정하도록 구성되어 있는 것이다. 따라서 이미 컴포지션이 설정된 ComposeView에 대해서는 발동하지 않는다.
- 내부를 들어가면 아래와 같은 함수가 구성되어 있다.
private fun ensureCompositionCreated() {
if (composition == null) {
try {
creatingComposition = true
composition = setContent(resolveParentCompositionContext()) {
Content()
}
} finally {
creatingComposition = false
}
}
}
- 그래서 이를 위해 제대로 갱신하려면 기존의 컴포지션을 해제하는 disposeComposition()을 먼저 호출하도록 구성하면 된다.
mainAddBtn.disposeComposition()
mainAddBtn.setContent {
TbFloatingActionButton(
...
- 사실 이렇게 변경이 필요한 경우에는 전체적으로 Compose Migration 진행한 후, 리컴포지션을 활용하는 것이 좋다.
- 당장 마이그레이션이 어려운 상황이라 임시 방편으로 처리..
반응형