Skip to content

[Feat] Snackbar, Dialog를 compose component로 만들어요#419

Open
HI-JIN2 wants to merge 7 commits intodevelopfrom
feat/compose-component
Open

[Feat] Snackbar, Dialog를 compose component로 만들어요#419
HI-JIN2 wants to merge 7 commits intodevelopfrom
feat/compose-component

Conversation

@HI-JIN2
Copy link
Member

@HI-JIN2 HI-JIN2 commented Nov 25, 2025

Summary

기존의 xml로 제작된 Snackbar, Dialog를 compose component로 작성합니다.

Describe your changes

피그마 프리뷰
스크린샷 2026-03-03 오후 6 56 06 스크린샷 2026-03-03 오후 6 37 47
스크린샷 2026-03-03 오후 6 57 01 스크린샷 2026-03-03 오후 7 18 57

Compose는 기존 명령형 XML(dialog.show())과 달리 State 기반으로 UI를 보여주기 때문에 별도의 Util 함수 없이도 쉽게 선언하여 사용할 수 있습니다.

  1. Dialog 사용 예시
    Compose에서는 boolean 기반의 상태(State) 변수를 하나 두고, 이 값이 true일 때만 다이얼로그 컴포저블을 호출하는 방식으로 사용합니다.
@Composable
fun MyScreen() {
    // 다이얼로그 노출 여부를 관리하는 State
    var showDialog by remember { mutableStateOf(false) }
    Column {
        Button(onClick = { showDialog = true }) {
            Text("다이얼로그 띄우기")
        }
    }
    // showDialog가 true일 때만 화면에 그려짐
    if (showDialog) {
        EatSsuDialog(
            title = "리뷰를 삭제하시겠어요?",
            description = "삭제한 리뷰는 다시 복구할 수 없습니다.",
            confirmText = "확인",
            dismissText = "취소",
            onConfirmClick = {
                // TODO: 확인 버튼 눌렀을 때의 처리 로직
                showDialog = false 
            },
            onDismissButtonClick = { 
                // 취소 버튼 눌렀을 때
                showDialog = false 
            },
            onDismissRequest = { 
                // 다이얼로그 바깥 영역을 터치해 닫을 때
                showDialog = false 
            }
        )
    }
}
  1. Snackbar 사용 예시
    Snackbar는 비동기로 일정 시간 동안 띄웠다가 사라져야 하므로, Compose에서 기본 제공하는 SnackbarHostState와 코루틴을 이용합니다. Scaffold의 snackbarHost에 우리가 만든 EatSsuSnackbarHost를 연결해 주면 됩니다.
@Composable
fun MyScreen() {
    // 스낵바 상태를 관리하는 객체와 코루틴 스코프
    val snackbarHostState = remember { SnackbarHostState() }
    val coroutineScope = rememberCoroutineScope()
    Scaffold(
        snackbarHost = {
            //  커스텀 스낵바 호스트 연결
            EatSsuSnackbarHost(
                hostState = snackbarHostState,
                type = EatSsuSnackbarType.Success // 스낵바 타입 설정 (Success, Danger 등)
            )
        }
    ) { paddingValues ->
        Button(
            modifier = Modifier.padding(paddingValues),
            onClick = {
                // 스낵바는 suspending 함수이므로 코루틴 안에서 실행
                coroutineScope.launch {
                    snackbarHostState.showSnackbar(
                        message = "리뷰가 성공적으로 등록되었어요."
                    )
                }
            }
        ) {
            Text("스낵바 띄우기")
        }
    }
}

Issue

To reviewers

#409 가 머지되면 리소스 파일 및 enum을 사용하려 합니다

@HI-JIN2 HI-JIN2 self-assigned this Nov 25, 2025
@HI-JIN2 HI-JIN2 changed the title [Feat Snackbar / Dialog - compose component [Feat] Snackbar / Dialog - compose component Nov 25, 2025
@HI-JIN2 HI-JIN2 force-pushed the feat/compose-component branch from f308e99 to 0760ff1 Compare December 29, 2025 06:01
@HI-JIN2 HI-JIN2 force-pushed the feat/compose-component branch from 0760ff1 to 0e27187 Compare March 3, 2026 09:19
@HI-JIN2 HI-JIN2 marked this pull request as ready for review March 3, 2026 10:19
@HI-JIN2 HI-JIN2 requested a review from PeraSite March 3, 2026 10:19
@HI-JIN2 HI-JIN2 changed the title [Feat] Snackbar / Dialog - compose component [Feat] Snackbar, Dialog를 compose component로 만듧니다 Mar 3, 2026
@HI-JIN2 HI-JIN2 changed the title [Feat] Snackbar, Dialog를 compose component로 만듧니다 [Feat] Snackbar, Dialog를 compose component로 만들어요 Mar 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

토스트, 다이알로그 컴포즈 컴포넌트 제작

1 participant