mitch
mitch

Reputation: 927

Snackbar is never dismissed (Jetpack Compose SnackbarHostState)

Description

Calling showSnackbar on SnackbarHostState and passing a duration argument does not dismiss the Snackbar. The coroutine appears to suspend for infinity.

Steps to Reproduce:

val snackbarHostState = remember{mutableStateOf(SnackbarHostState())}

Column {
    Button(
        onClick = {
            lifecycleScope.launch {
                val time = System.currentTimeMillis()
                Log.d(TAG, "showing snackbar")
                snackbarHostState.value.showSnackbar(
                    message = "Hey look a snackbar",
                    actionLabel = "Hide",
                    duration = SnackbarDuration.Short
                )
                Log.d(TAG, "done ${System.currentTimeMillis()-time}") // <-- Never called
            }
        }
    ) {
        Text("Show snackbar")
    }
    snackbarHostState.value.currentSnackbarData?.let { snackbarData ->
        ConstraintLayout(
            modifier = Modifier.fillMaxSize()
        ) {
            val snackbar = createRef()
            Snackbar(
                modifier = Modifier.constrainAs(snackbar) {
                    bottom.linkTo(parent.bottom)
                    start.linkTo(parent.start)
                    end.linkTo(parent.end)
                },
                snackbarData = snackbarData,
            )
        }
    }
}

Upvotes: 7

Views: 7131

Answers (1)

mitch
mitch

Reputation: 927

I guess you need to wrap the Snackbar in a SnackbarHost because this works as expected.

val snackbarHostState = remember{mutableStateOf(SnackbarHostState())}

Column {
    Button(
        onClick = {
            lifecycleScope.launch {
                val time = System.currentTimeMillis()
                Log.d(TAG, "showing snackbar")
                snackbarHostState.value.showSnackbar(
                    message = "Hey look a snackbar",
                    actionLabel = "Hide",
                    duration = SnackbarDuration.Short
                )
                Log.d(TAG, "done ${System.currentTimeMillis()-time}") // <-- Never called
            }
        }
    ) {
        Text("Show snackbar")
    }
    ConstraintLayout(
        modifier = Modifier.fillMaxSize()
    ) {
        val snackbar = createRef()
        SnackbarHost(
            modifier = Modifier.constrainAs(snackbar) {
                bottom.linkTo(parent.bottom)
                start.linkTo(parent.start)
                end.linkTo(parent.end)
            },
            hostState = snackbarHostState.value,
            snackbar = {
                Snackbar(
                    action = {
                        TextButton(onClick = {
                            snackbarHostState.value.currentSnackbarData?.dismiss()
                        }) {
                            Text(
                                text = "Hide",
                            )
                        }
                    }
                ) {
                    Text("hey look a snackbar")
                }
            }
        )
    }
}

Upvotes: 5

Related Questions