- SnackbarHostState를 통해 Snackbar 처리
- coroutineScope 필요
- Snackbar가 보여지는 부분은 SnackbarHost로 선언
val snackbarHostState = remember { SnackbarHostState() }
val coroutineScope = rememberCoroutineScope()
...
Button (onClick = {
coroutineScope.launch {
snackbarHostState.showSnackbar(
message = "스낵바아ㅏ",
actionLabel = "확인",
duration = SnackbarDuration.Short
).let {
when (it) {
SnackbarResult.Dismissed -> Log.d("TAG", "SnackbarContainer: 스낵바 닫아짐")
SnackbarResult.ActionPerformed -> Log.d("TAG", "SnackbarContainer: 확인 버튼 눌러짐")
}
}
}
}) {
Text("스낵바 보여주기")
}
SnackbarHost(
hostState = snackbarHostState,
modifier = Modifier.align(Alignment.BottomCenter)
)
- Snackbar가 떠있는지 여부는 SnackbarHostState.currentSnackbarData를 통해 감지
- currentSnackbarData로 UI변경, 이미 있는 토스트 닫기 등 이벤트 처리 가능
val buttonTitle: (SnackbarData?) -> String = { snackbarData ->
if (snackbarData != null) "스낵바 숨기기"
else "스낵바 보여주기"
}
...
Button (onClick = {
if (snackbarHostState.currentSnackbarData != null) {
Log.d("TAG", "SnackbarContainer: 이미 스낵바가 있음")
snackbarHostState.currentSnackbarData?.dismiss()
return@Button
}
coroutineScope.launch {
snackbarHostState.showSnackbar(
message = "스낵바아ㅏ",
actionLabel = "확인",
duration = SnackbarDuration.Short
).let {
when (it) {
SnackbarResult.Dismissed -> Log.d("TAG", "SnackbarContainer: 스낵바 닫아짐")
SnackbarResult.ActionPerformed -> Log.d("TAG", "SnackbarContainer: 확인 버튼 눌러짐")
}
}
}
}) {
Text(buttonTitle(snackbarHostState.currentSnackbarData))
}