기본적으로 컴포즈는 ComposeView가 윈도우에서 분리될 때마다 컴포지션을 삭제한다. 이런 부분은 ComposeView가 프레그먼트내에서 사용될 때 여러가지 이유로 바람직 하지않다.
- 컴포지션은 Compose UI 보기 타입이 상태를 저장하기 위해, 프래그먼트의 View 생명주기를 따라야 한다.
- 트랜지션 또는 윈도우 트랜지션이 발생할 때 Compose UI 요소를 화면에 유지한다는 것은, 전환하는 동안 ComposeView 자체는 윈도우에서 분리된 후에도 계속 표시됨을 의미 한다.
AbstractComposeView.disposeComposition 메서드를 수동으로 호출하여 컴포지션을 수동으로 삭제할 수 있다. 또는 더 이상 필요하지 않을 때, 컴포지션을 자동으로 폐기하려면 다른 전략을 설정하거나 setViewCompositionStrategy 메서드를 호출하여, 자신만의 전략을 만들 수 있다.
제공하는 DisposeOnViewTreeLifecycleDestroyed 전략을 사용하여 프레그먼트 LifecycleOwner가 파괴될 때 컴포지션을 삭제한다.
PlantDetailFragment에는 enter 및 exit 트랜지션이 있고(자세한 정보는 nav_garden.xml을 확인) 나중에 Compose 내부에서 View 타입을 사용할 것이므로, ComposeView가 DisposeOnViewTreeLifecycleDestroyed 전략을 사용하고 있는지 확실히 해야 한다. 뭐 어쨌던간에 프레그먼트에서 ComposeView를 사용할 때는 항상 이 전략을 설정하는 것이 좋다. (ComposeView의 ViewCompositionStrategy를 참조하자)
plantdetail/PlantDetailFragment.kt
class PlantDetailFragment : Fragment() {
...
override fun onCreateView(...): View? {
val binding = DataBindingUtil.inflate<FragmentPlantDetailBinding>(
inflater, R.layout.fragment_plant_detail, container, false
).apply {
...
composeView.apply {
// View의 LifecycleOwner가 파괴될 때 컴포지션을 폐기 한다.
setViewCompositionStrategy(
ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
)
setContent {
MaterialTheme {
PlantDetailDescription()
}
}
}
}
...
}
}
0개의 댓글