컴포즈를 사용하면 기존 Lifecycle 을 이용할때랑 같은 방식으로 작동하지가 않는다.
조금 다른 방식을 사용해야하는데 컴포즈에서 말하는 부수효과에 대한 이해가 필요하다.
https://developer.android.com/jetpack/compose/side-effects?hl=ko
위 링크에 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 = {
// 부르고 싶은 것
}
)
이렇게 사용하면 된다~
반응형
'Android > Android Compose' 카테고리의 다른 글
Jetpack Compose CompositionLocal 에 대해 알아봅시다 (0) | 2024.03.31 |
---|---|
스와이프 삭제 구현 (0) | 2024.03.10 |
[안드로이드 컴포즈] 스와이프 삭제 구현 (1) | 2024.01.14 |
안드로이드 컴포즈 dialog 커스텀 하기 (0) | 2023.12.20 |
안드로이드 컴포즈 1주차 정리 (0) | 2021.11.07 |
안드로이드 컴포즈 - GDG DevFest2021 참여하다. (0) | 2021.11.02 |
Android Compose - 컴포즈의 매력을 직접 느껴보자 (0) | 2021.10.27 |
Android Compose 는 무엇일까? (0) | 2021.10.27 |