기본적으로 컴포즈는 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()
                    }
                }
            }
        }
        ...
    }
}

donaricano-btn

카테고리: Compose

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.