Snackbar

정용우·2023년 7월 16일
0

Compose

목록 보기
8/8
post-thumbnail
  • 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))
}

0개의 댓글