android-jetpack-compose - Snackbar 永远不会被解雇 (Jetpack Compose SnackbarHostState)
问题描述
描述
调用showSnackbar
并SnackbarHostState
传递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,
)
}
}
}
解决方案
我想您需要将Snackbar
a包装起来,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")
}
}
)
}
}
推荐阅读
- python - 尝试在 Python 中格式化连接字符串 - 无法用变量替换
- java - 输入流后输出流不起作用
- amazon-web-services - 使用 MsTscLib 连接到 AWS EC2 实例
- python - 我正在尝试为项目列表执行打印语句,每个项目都在使用 \n 的新行上,但我不断收到语法错误。我找不到问题
- angular - 在 Angular 中使用日期选择器和 ASP.NET 核心 Web API 中的后端时出现服务器错误(状态:500)
- c++ - 陷入无限循环(骑士之旅问题)
- sql-server - 创建以年和月为输入的日期时间
- inheritance - 如何在 AEM 上隐藏继承的对话框属性
- python-3.x - python的pygame中的奇怪编码。为什么我需要在 latin-1 中编码,然后在 utf-8 中解码以获得正确的字符?
- detox - 无法排毒找到 iPhone X 或 iPhone 11 之前的模拟器