@Composable
fun SnackbarDemo() {
val scaffoldState = rememberScaffoldState() // this contains the `SnackbarHostState`
val coroutineScope = rememberCoroutineScope()
Scaffold(
modifier = Modifier,
scaffoldState = scaffoldState // attaching `scaffoldState` to the `Scaffold`
) {
Button(
onClick = {
coroutineScope.launch { // using the `coroutineScope` to `launch` showing the snackbar
// taking the `snackbarHostState` from the attached `scaffoldState`
val snackbarResult = scaffoldState.snackbarHostState.showSnackbar(
message = "This is your message",
actionLabel = "Do something."
)
when (snackbarResult) {
Dismissed -> Log.d("SnackbarDemo", "Dismissed")
ActionPerformed -> Log.d("SnackbarDemo", "Snackbar's button clicked")
}
}
}
) {
Text(text = "A button that shows a Snackbar")
}
}
}
@Composable
fun SnackbarDemo() {
val scaffoldState = rememberScaffoldState() // this contains the `SnackbarHostState`
val (showSnackBar, setShowSnackBar) = remember {
mutableStateOf(false)
}
if (showSnackBar) {
LaunchedEffect(scaffoldState.snackbarHostState) {
// Show snackbar using a coroutine, when the coroutine is cancelled the
// snackbar will automatically dismiss. This coroutine will cancel whenever
// `showSnackBar` is false, and only start when `showSnackBar` is true
// (due to the above if-check), or if `scaffoldState.snackbarHostState` changes.
val result = scaffoldState.snackbarHostState.showSnackbar(
message = "Error message",
actionLabel = "Retry message"
)
when (result) {
SnackbarResult.Dismissed -> {
setShowSnackBar(false)
}
SnackbarResult.ActionPerformed -> {
setShowSnackBar(false)
// perform action here
}
}
}
}
Scaffold(
modifier = Modifier,
scaffoldState = scaffoldState // attaching `scaffoldState` to the `Scaffold`
) {
Button(
onClick = {
setShowSnackBar(true)
}
) {
Text(text = "A button that shows a Snackbar")
}
}
}
8条答案
按热度按时间aor9mmx11#
您需要两样东西:
SnackbarHostState
-它将管理Snackbar
的状态(* 您通常会从ScaffoldState
获得该信息 *)CoroutineScope
-负责showing
您的Snackbar
kgsdhlau2#
在Bartek的答案的基础上,你还可以使用Compose的副作用,这样你就不必管理CoroutineScope本身。
由于
Composables
本身应该没有副作用,因此建议使用Compose's Effect APIs
,以便以可预测的方式执行这些副作用。在您的特定情况下,您可以使用
LaunchedEffect API
在可组合的范围内运行suspend函数。示例代码如下所示:41ik7eoe3#
你可以用这个
amrnrhlw4#
如果您使用新的材料3,则支架中会有新字段:“小吃店主机”
vql8enpb5#
首先,您需要一个SnackbarHostState,您可以将此状态向下传递给您的组合对象,在其中您希望触发snackbar消息。或者,如果您使用scaffold,请使用
scaffoldState.snackbarHostState
显示小吃店是一个副作用,应该 Package 在
LaunchEffect
可组合更多信息请访问https://developer.android.com/topic/architecture/ui-layer/events#consuming-trigger-updates
和https://developer.android.com/jetpack/compose/side-effects的值
pprl5pva6#
您也可以使用
SnackBar
Composable显示没有Scaffold的snackBar。LaunchedEffect是将其从合成中删除,如果愿意,可以使用幻灯片动画。
qvsjd97n7#
让我补充一个答案,我没有使用脚手架,而是使用状态吊装。
gfttwv5a8#
为了防止您需要一个snackbar作为一个单独的函数,以便在其他屏幕中使用自定义参数进行调用,并且不使用scaffold,我在下面使用了这个函数。
参数
openSnackbar: (Boolean) -> Unit
用于重置打开条件var openMySnackbar by remember { mutableStateOf(false) }
,并允许在其他时间打开snackbar。并这样使用:
@可组合的乐趣MyScreen(){
}