문제 상황
HomeViewModel에 있는 message라는 변수를 통해서 snackbar를 관리하고 있습니다. 그런데 다른 뷰모델에서 api 통신시 발생하는 에러도 사용자에게 snackbar로 알려주고 싶어서, 뷰모델에 관련 없이 사용할 수 있도록 snackbar에 관련된 기능을 모아둔 유틸 파일을 하나 만들려고 합니다.
Snackbar
Snackbar는 Android 애플리케이션에서 사용자에게 간단한 메시지를 제공하는 데 사용되는 UI 요소입니다. Snackbar는 화면 하단에 잠시 나타났다 사라지는 방식으로, 사용자에게 피드백이나 안내 메시지를 제공할 때 유용합니다. 이는 사용자가 현재 작업 중에 다른 화면으로 이동하지 않고도 정보를 받을 수 있도록 합니다.
Snackbar.make(view, "Item deleted", Snackbar.LENGTH_LONG)
.setAction("UNDO") {
// Perform the undo operation
}
.show()
그리고 버튼을 추가하여 사용자가 특정 작업을 수행할 수 있도록 할 수 있습니다.
SnackBarUtils
object SnackBarUtils {
private lateinit var snackBarHostState: SnackbarHostState
fun init(snackBarHostState: SnackbarHostState) {
this.snackBarHostState = snackBarHostState
}
suspend fun showSnackBar(
message: String,
actionLabel: String? = null,
onActionClick: (() -> Unit)? = null,
duration: SnackbarDuration = SnackbarDuration.Short,
) {
if (this::snackBarHostState.isInitialized) {
val result = snackBarHostState.showSnackbar(
message = message,
actionLabel = actionLabel,
duration = duration
)
if (result == SnackbarResult.ActionPerformed) {
onActionClick?.invoke()
}
} else {
throw UninitializedPropertyAccessException("SnackBarHostState is not initialized. Call init() first.")
}
}
}
@Composable
fun BottomNavigationBar(
paddingValues: PaddingValues,
callbackManager: CallbackManager,
) {
val navController = rememberNavController()
val viewModel: HomeViewModel = hiltViewModel()
val dialogMessage by viewModel.dialogMessage.collectAsState()
val snackbarHostState = remember { SnackbarHostState() }
LaunchedEffect(Unit) {
SnackBarUtils.init(snackbarHostState)
}
Scaffold(
modifier = Modifier.padding(paddingValues),
bottomBar = {
if (showBottomBar.value) {
BottomBar(navController = navController)
}
},
snackbarHost = {
SnackbarHost(hostState = snackbarHostState)
},
) {
dialogMessage?.let { message ->
LaunchedEffect(message) {
SnackBarUtils.showSnackBar(message = message)
viewModel.updateMessage(null)
}
}
}
}
참고 링크
https://developer.android.com/reference/com/google/android/material/snackbar/Snackbar
'질문 정리' 카테고리의 다른 글
안드로이드 PDF 파일 저장하기 구현 (1) | 2024.06.28 |
---|---|
컴포즈 블루투스 권한 없을 때 처리 (0) | 2024.06.27 |
Intent 정리: 문의하기 클릭 시 이메일 앱으로만 연결 (0) | 2024.06.19 |
Kotlin에서 리스트와 맵의 변환: 순서가 유지될까? (0) | 2024.06.18 |
안드로이드 알림 구현(헤드업 알림 포함) (0) | 2024.06.17 |