iOS 风格弹框组件集 (Compose版)

iOSStyleDialogs.kt

复制代码
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties

// 1. 基础确认对话框
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IOSConfirmDialog(
    title: String,
    message: String,
    onDismiss: () -> Unit,
    confirmText: String = "确认",
    cancelText: String = "取消",
    confirmColor: Color = MaterialTheme.colorScheme.primary,
    cancelColor: Color = MaterialTheme.colorScheme.onSurface,
    onConfirm: () -> Unit,
    onCancel: () -> Unit = onDismiss
) {
    AlertDialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(
            dismissOnBackPress = true,
            dismissOnClickOutside = false
        )
    ) {
        Surface(
            shape = RoundedCornerShape(12.dp),
            tonalElevation = 6.dp
        ) {
            Column {
                // 标题
                Text(
                    text = title,
                    style = MaterialTheme.typography.headlineSmall,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 24.dp, start = 24.dp, end = 24.dp)
                )

                // 消息内容
                Text(
                    text = message,
                    style = MaterialTheme.typography.bodyMedium,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(24.dp)
                )

                // 按钮区域
                Divider(color = Color.LightGray.copy(alpha = 0.3f))
                Row {
                    TextButton(
                        onClick = {
                            onCancel()
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = cancelText,
                            color = cancelColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                    Divider(
                        color = Color.LightGray.copy(alpha = 0.3f),
                        modifier = Modifier
                            .width(1.dp)
                            .height(44.dp)
                    )
                    TextButton(
                        onClick = {
                            onConfirm()
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = confirmText,
                            color = confirmColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                }
            }
        }
    }
}

// 2. 带输入框的对话框
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IOSInputDialog(
    title: String,
    message: String,
    onDismiss: () -> Unit,
    confirmText: String = "确认",
    cancelText: String = "取消",
    confirmColor: Color = MaterialTheme.colorScheme.primary,
    cancelColor: Color = MaterialTheme.colorScheme.onSurface,
    initialValue: String = "",
    placeholder: String = "请输入",
    onConfirm: (String) -> Unit,
    onCancel: () -> Unit = onDismiss
) {
    var inputValue by remember { mutableStateOf(initialValue) }

    AlertDialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(
            dismissOnBackPress = true,
            dismissOnClickOutside = false
        )
    ) {
        Surface(
            shape = RoundedCornerShape(12.dp),
            tonalElevation = 6.dp
        ) {
            Column {
                // 标题
                Text(
                    text = title,
                    style = MaterialTheme.typography.headlineSmall,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 24.dp, start = 24.dp, end = 24.dp)
                )

                // 消息内容和输入框
                Column(
                    modifier = Modifier.padding(horizontal = 24.dp)
                ) {
                    Text(
                        text = message,
                        style = MaterialTheme.typography.bodyMedium,
                        textAlign = TextAlign.Center,
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(bottom = 12.dp)
                    )
                    OutlinedTextField(
                        value = inputValue,
                        onValueChange = { inputValue = it },
                        modifier = Modifier.fillMaxWidth(),
                        singleLine = true,
                        placeholder = { Text(placeholder) },
                        shape = RoundedCornerShape(8.dp)
                    )
                }

                // 按钮区域
                Divider(color = Color.LightGray.copy(alpha = 0.3f))
                Row {
                    TextButton(
                        onClick = {
                            onCancel()
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = cancelText,
                            color = cancelColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                    Divider(
                        color = Color.LightGray.copy(alpha = 0.3f),
                        modifier = Modifier
                            .width(1.dp)
                            .height(44.dp)
                    )
                    TextButton(
                        onClick = {
                            onConfirm(inputValue)
                            onDismiss()
                        },
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        Text(
                            text = confirmText,
                            color = confirmColor,
                            style = MaterialTheme.typography.labelLarge
                        )
                    }
                }
            }
        }
    }
}

// 3. 单按钮提示框
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun IOSInfoDialog(
    title: String,
    message: String,
    onDismiss: () -> Unit,
    buttonText: String = "确定",
    buttonColor: Color = MaterialTheme.colorScheme.primary,
    onConfirm: () -> Unit = onDismiss
) {
    AlertDialog(
        onDismissRequest = onDismiss,
        properties = DialogProperties(
            dismissOnBackPress = true,
            dismissOnClickOutside = false
        )
    ) {
        Surface(
            shape = RoundedCornerShape(12.dp),
            tonalElevation = 6.dp
        ) {
            Column {
                // 标题
                Text(
                    text = title,
                    style = MaterialTheme.typography.headlineSmall,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(top = 24.dp, start = 24.dp, end = 24.dp)
                )

                // 消息内容
                Text(
                    text = message,
                    style = MaterialTheme.typography.bodyMedium,
                    textAlign = TextAlign.Center,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(24.dp)
                )

                // 按钮区域
                Divider(color = Color.LightGray.copy(alpha = 0.3f))
                TextButton(
                    onClick = {
                        onConfirm()
                        onDismiss()
                    },
                    modifier = Modifier.fillMaxWidth()
                ) {
                    Text(
                        text = buttonText,
                        color = buttonColor,
                        style = MaterialTheme.typography.labelLarge
                    )
                }
            }
        }
    }
}

// 预览
@Preview
@Composable
private fun PreviewDialogs() {
    MaterialTheme {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(16.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            // 预览确认对话框
            var showConfirm by remember { mutableStateOf(false) }
            Button(onClick = { showConfirm = true }) {
                Text("显示确认对话框")
            }
            if (showConfirm) {
                IOSConfirmDialog(
                    title = "删除确认",
                    message = "确定要删除这条数据吗?删除后不可恢复",
                    onDismiss = { showConfirm = false },
                    onConfirm = { /* 确认操作 */ }
                )
            }

            // 预览输入对话框
            var showInput by remember { mutableStateOf(false) }
            Button(onClick = { showInput = true }) {
                Text("显示输入对话框")
            }
            if (showInput) {
                IOSInputDialog(
                    title = "修改昵称",
                    message = "请输入新的昵称",
                    onDismiss = { showInput = false },
                    onConfirm = { input -> println("新昵称: $input") }
                )
            }

            // 预览提示对话框
            var showInfo by remember { mutableStateOf(false) }
            Button(onClick = { showInfo = true }) {
                Text("显示提示对话框")
            }
            if (showInfo) {
                IOSInfoDialog(
                    title = "操作成功",
                    message = "您的资料已提交审核",
                    onDismiss = { showInfo = false }
                )
            }
        }
    }
}
相关推荐
Android-Flutter9 天前
android compose shadow 阴影 使用
android·kotlin·compose
Android-Flutter10 天前
android compose 自定义Painter绘制图形 使用
android·kotlin·compose
Android-Flutter10 天前
android compose Brush 渐变和着色器 使用
android·kotlin·compose
至乐活着1 个月前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose
le1616161 个月前
Android Compose——尺寸修饰符的调用顺序构成的不同尺寸约束效果
android·compose·modifier
le1616161 个月前
Android Compose Modifier修饰符
android·compose·modifier
小书房1 个月前
Android UI为什么由XML转向Compose
xml·ui·compose·声明式ui
le1616161 个月前
Android Compose基础布局——从传统XML的视角切入了解
xml·compose
赏金术士2 个月前
企业级 Jetpack Compose 项目(入门版)最佳结构
android·kotlin·compose
Jomurphys2 个月前
Compose 调用 - 液态玻璃 Backdrop
android·compose