질문 정리

Compose Snackbar 알림 관리를 위한 Utils

five2week 2024. 6. 20. 14:50

문제 상황

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

 

Snackbar  |  Android Developers

Stay organized with collections Save and categorize content based on your preferences. Snackbar public class Snackbar extends BaseTransientBottomBar Snackbars provide lightweight feedback about an operation. They show a brief message at the bottom of the s

developer.android.com