LaunchedEffect
: suspend 함수를 Composable 내부에서 호출할수 있게 해준다.
scrollToItem()
**LaunchedEffect
**는 key 라고 불리는 기준값을 두어서 key가 바뀔 때만 LaunchedEffect 의 suspend fun 을 취소하고 재실행한다.
재구성이 발생해도 suspend fun 이 유지되도록 할 수 있다.
마치 Column 컴포즈의 key()
함수와 비슷하다.
LaunchdEffect
의 Suspend
수명주기는 다음과 같다.
실행시점 | 종료시점 | 재실행 Tigger 조건 |
---|---|---|
Compostion enter | Composition leave | 파라미터의 key 값 변경 |
LaunchedEffect
로 생성된 coroutine scope는 기본적으로 해당 composable의 생성 주기에 따른다.
Scaffold의 SnackbarHostState.sohwSnacbak()
suspend 함수를 실행하여 snackbar 를 띄우는 예제
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MyScreen(mainViewModel: MainViewModel = viewModel()) {
val snackBarHostState = remember { SnackbarHostState() }
val isError by mainViewModel.error.observeAsState(false)
//isError 변수
if(isError) {
//isError 변수를 LaunchedEffect 의 key로 설정
LaunchedEffect(isError) {
//이 블록은 isError 가 바뀔때마다 취소되고 재수행된다.
try {
snackBarHostState.showSnackbar(
message = "Error message",
actionLabel = "Retry message"
)
} catch (e: CancellationException) {
Log.e("composeTest", "canceled!!")
}
}
}
Scaffold(snackbarHost = { SnackbarHost(snackBarHostState) }) {
Box(modifier = Modifier.padding(it)) {
MainScreen()
}
}
}