Android/Android Compose
Jetpack Compose 에서 Lifecycle 관리하기
최데브
2023. 5. 11. 22:35
컴포즈를 사용하면 기존 Lifecycle 을 이용할때랑 같은 방식으로 작동하지가 않는다.
조금 다른 방식을 사용해야하는데 컴포즈에서 말하는 부수효과에 대한 이해가 필요하다.
https://developer.android.com/jetpack/compose/side-effects?hl=ko
Compose의 부수 효과 | Jetpack Compose | Android Developers
Compose의 부수 효과 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 부수 효과는 구성 가능한 함수의 범위 밖에서 발생하는 앱 상태에 관한 변경사항입니다.
developer.android.com
위 링크에 DisposableEffect 에 대해 예시를 들때 아래 코드와 비슷한 예제가 나온다.
여기서도 lifecycle 관리하는 방법으로 예시를 들어놨는데 참고하면 좋을 듯 하다.
@Composable
private fun DisposableEffectWithLifeCycle(
onResume: () -> Unit
) {
val context = LocalContext.current
//생명주기 상태 변경을 관찰하는 콜백 인터페이스
val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
// rememberUpdatedState 는 상위 컴포저블의 데이터가 바뀔때 하위 컴포저블의 remember 된
//데이터도 바뀌어야할때 사용
val currentOnResume by rememberUpdatedState(onResume)
//Composable 의 lifecycle 에 맞춰 정리해야하는 리스너나 작업이 있는경우에
//리스너나 작업을 제거하기 위해 사용되는 Effect 가 DisposableEffect
//부수효과 처리중 재시작되거나 컴포즈가 화면에서 사라지는경우 리소스 해제가 필요할때
//사용한다
//즉 lifecycleOwner 가 변경시 기존 콜백을 remove하고 재시작한다.
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> {
currentOnResume()
}
else -> {}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
//DisposableEffect 는 onDispose 를코드 블록의 최종문장으로 포함해야함
//포함하지 않으면 에러 발생
//부수효과를
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
Toast.makeText(
context,
"사라짐",
Toast.LENGTH_SHORT
)
.show()
}
}
}
위처럼 만들고 부르는곳은
DisposableEffectWithLifeCycle(
onResume = {
// 부르고 싶은 것
}
)
이렇게 사용하면 된다~