如何显示使用 Jetpack Compose 创建的通用对话框?

Mat*_*ert 6 android android-jetpack-compose

当我开始使用 Compose 而不是 xml 创建所有新的 UI 组件时,我不确定如何处理在 Compose 中创建的对话框。

在 Compose之外使用对话框只需要对话框的上下文:

val builder = AlertDialog.Builder(context as Activity, R.style.PermissionInfoDialog)
[...]
builder.show()
Run Code Online (Sandbox Code Playgroud)

只要您有上下文,这就可以让您从“任何地方”触发对话框(是的,我意识到这可能会被滥用),但据我所知,对于撰写,我需要一个“可组合视图”来添加自定义撰写对话框?当您有一个可以显示特定对话框的特定片段时,这是可以管理的,但如果您想要可以重复使用的更通用的片段,例如:

  • 处理一般错误消息并向用户显示错误(来自“所有视图/片段/活动”)
  • 在 UI 的多个部分请求权限
  • ETC。

那么这会变得更加混乱。

在我的特定场景中,我有许多不同的片段需要请求权限的能力。请求权限的能力(这要求我们向用户解释为什么需要它)以自定义对话框开头。这个抽象片段包含这个逻辑,但是抽象片段不知道添加我的 Compose 对话框所需的(?)单个 ComposeView 或 xml(因为这个应用程序是新旧内容的混合体)。当然,我可以有一个函数,让抽象片段请求“在某个地方显示对话框”,并让每个片段提供一个 ComposeView,但这对我来说感觉不自然且被迫。

关于如何解决这个问题,我是否缺少一些东西和/或一些“常见做法”?我想我正在寻找与旧解决方案类似(逻辑上)的东西,即简单地引用上下文(或类似的)来显示对话框。

SUR*_*S R 0

请使用AlertDialog在撰写中添加对话框。

val openDialog = remember { mutableStateOf(true) }

if (openDialog.value) {
    AlertDialog(
        onDismissRequest = {
            openDialog.value = false
        },
        title = {
            Text(text = "Title")
        },
        text = {
            Text(
                "This area typically contains the supportive text " +
                    "which presents the details regarding the Dialog's purpose."
            )
        },
        buttons = {
            Row(
                modifier = Modifier.padding(all = 8.dp),
                horizontalArrangement = Arrangement.Center
            ) {
                Button(
                    modifier = Modifier.fillMaxWidth(),
                    onClick = { openDialog.value = false }
                ) {
                    Text("Dismiss")
                }
            }
        }
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 但这仍然需要我有一个可组合的视图来将其膨胀,它并不能解决手头的问题。 (4认同)