컴포저블의 범위에서 정지 함수 실행
컴포지션 인식 범위를 확보하여 컴포저블 외부에서 코루틴 실행
값이 변경되는 경우 다시 시작되지 않아야 하는 효과에서 값 참조
정리가 필요한 효과
Ex) 파일을 열었다 닫는다. 짝을 맞춰야 하는 동작
Compose 상태를 비 Compose 코드에 게시
비 Compose 상태를 Compose 상태로 변환
하나 이상와 상태 객체를 다른 상태로 변환
Compose의 상태를 Flow로 변환
@Composable
fun EffectEx(lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current) {
val snackBarHostState = remember { SnackbarHostState() }
// LaunchedEffect를 이용해서 스낵바를 이용
LaunchedEffect(snackBarHostState) {
// suspend 함수 쓸수있는 coroutine scope
snackBarHostState.showSnackbar(message = "Hello Compose")
}
// Disposable Effect 호출
DisposableEffect(key1 = lifecycleOwner) {
// 1. 필요에 따라 어떤 일을 함
val observer = LifecycleEventObserver { _, event -> // source , event
when (event) {
ON_START -> Log.d("Effect", "ON_START")
ON_STOP -> Log.d("Effect", "ON_STOP")
else -> Log.d("Effect", "ELSE: ${event.name}")
}
}
lifecycleOwner.lifecycle.addObserver(observer)
// 2. 이후 정리
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
Scaffold(
snackbarHost = { SnackbarHost(snackBarHostState) }
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding))
}
}