首页 > 解决方案 > Snackbar 永远不会被解雇 (Jetpack Compose SnackbarHostState)

问题描述

描述

调用showSnackbarSnackbarHostState传递duration参数不会关闭 Snackbar。协程似乎无限期暂停。

重现步骤:

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,
            )
        }
    }
}

标签: android-jetpack-compose

解决方案


我想您需要将Snackbara包装起来,SnackbarHost因为这可以按预期工作。

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")
                }
            }
        )
    }
}

推荐阅读