LaunchedEffect를 사용하다보면 한번만 호출해야 하는 경우가 생긴다. 그럴 때는 주로 Unit 또는 true를 사용하게 되는데 이 두개는 같은 동작을 하는데 권장되는 방법이 있을까 궁금증이 생겨 한번 알아보려고 한다.
/**
* The type with only one value: the `Unit` object. This type corresponds to the `void` type in Java.
*/
public object Unit {
override fun toString(): String = "kotlin.Unit"
}
위의 코드는 Unit의 내부 코드입니다. Unit에 대해서 알아보자면 Unit은 자바에서의 void 타입 역할을 하며, 아무것도 반환하지 않는 오직 한가지 값만 가지고 있습니다. 그렇기에 LaunchedEffect함수의 인자로 넣게 되면 최초 한번만 실행되게 됩니다.
true도 마찬가지로 값이 바뀌지 않기 때문에 인자로 넣게 되었을 때 최초 한번만 실행됩니다. 둘중 어느 한 가지 방법이 권장된다라는 것은 잘 모르겠지만 개인적으로는 많은 예시에서 본 적이 있고, Unit 자체가 한 가지 값만 가지고 있다는 것을 뜻하기에 Unit을 주로 사용하게 될 것 같다.
그렇다면 LaunchedEffect는 언제 호출이 될까???
LaunchedEffect는 해당 컴포저블 함수가 처음 컴포지션 될때 실행됩니다. 위처럼 Unit, true처럼 한번만 실행되도록 설정해놓았다면 리컴포지션이 되더라도 호출되지 않습니다.
잘 사용은 하지 않았지만 찾다보니 DisposableEffect를 알게 되었다.
DisposableEffect은 LaunchedEffect와 같이 처음 컴포지션에 포함되었을 때의 작업과 컴포지션에서 벗어나거나 key가 변경되었을 때 실행되는 onDisposeEffect를 가지고 있다. 아래와 같은 형태를 띄고 있다.
DisposableEffect(Unit) {
Log.d("DisposableEffect", "LoginPage")
onDispose {
Log.d("DisposableEffect", "LoginPage Disposed")
}
}
DisposableEffect(Unit) {
Log.d("DisposableEffect", "SignupPage")
onDispose {
Log.d("DisposableEffect", "SignupPage Disposed")
}
}
위의 코드는 각각 LoginPage와 SignUpPage에서의 DisposableEffect인데
LoginPage -> SignUpPage -> LoginPage로 이동했을 때의 호출 순서는 다음과 같다.
DisposableEffect를 사용하면 LaunchedEffect에서 하던 작업들도 모두 수행할 수 있으니 DisposableEffect만 사용하면 되는거 아닌가??하는 생각도 잠깐 들었지만 컴포지션에서 벗어날 때 실행되어야 하는 정리 작업들이 있지 않은 경우에는 굳이 DisposableEffect를 사용하지 않고 LaunchedEffect를 사용하는 것이 올바른 방법이라는 생각이 들었다.
'안드로이드' 카테고리의 다른 글
[Android] Coroutine (0) | 2024.10.14 |
---|---|
[Compose] viewModel(), hiltViewModel() 차이는 뭘까?? (1) | 2024.10.04 |
[Compose] 중복 클릭 제어(Throttle) (0) | 2024.09.25 |
[Android] ViewModel에서의 context (0) | 2024.09.21 |
[Compose] Navigation back stack (0) | 2024.09.18 |