Compose 도입 이전에도 Activity 와 Fragment, ViewModel 등 공동으로 적용되어야 하는 부분에 대해서 Base 클래스를 만들어왔다. 무엇보다도 Compose를 이용하여 UI를 구성 할 때, Theme를 일괄적으로 적용하기 위한 작업이 필요했다.
Compose로 구성되는 Fragment의 BaseFragment 부모 클래스를 다음과 같이 작성해보았다. 기존 BaseFragment가 있기 때문에 이름은 ComposeBaseFragment 정도로 명명했다.
abstract class ComposeBaseFragment<R : BaseViewModel> : Fragment() {
abstract val viewModel: R
@Composable
abstract fun Compose()
abstract fun afterCompose()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val compose = ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
MaterialTheme {
Compose()
}
}
}
afterCompose()
return compose
}
}
이 ComposeBaseFragment 를 상속해서 만든 Fragment 에서는
“Compose” Composable 함수 안에 Compose 코드들을 구성하고, afterCompose() 에서는 컴포즈 구성 이후 실행되어야 하는 다른 코드들을 작성할 수 있다.
필요에 따라 beforeCompose() 와 같은 함수를 만들어서 컴포즈 구성 이전에 실행되어야 하는 코드를 작성할 수도 있다.
답글 남기기