refactor: 优化对话框实现 & 调整参数顺序

This commit is contained in:
Super12138 2025-03-22 15:07:25 +08:00
parent 60927892c4
commit 7fd200c789
8 changed files with 39 additions and 77 deletions

View file

@ -34,7 +34,7 @@ android {
applicationId = "cn.super12138.todo"
minSdk = 24
targetSdk = 36
versionCode = 605
versionCode = 606
versionName = "2.1.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

View file

@ -20,22 +20,25 @@ import cn.super12138.todo.R
import cn.super12138.todo.utils.VibrationUtils
@Composable
fun WarningDialog(
fun ConfirmDialog(
modifier: Modifier = Modifier,
visible: Boolean,
icon: ImageVector = Icons.Outlined.ErrorOutline,
description: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
title: String = stringResource(R.string.title_warning),
text: String,
confirmButtonText: String = stringResource(R.string.action_confirm),
dismissButtonText: String = stringResource(R.string.action_cancel),
properties: DialogProperties = DialogProperties(),
modifier: Modifier = Modifier
onConfirm: () -> Unit,
onDismiss: () -> Unit
) {
BasicDialog(
visible = visible,
icon = icon,
title = stringResource(R.string.title_warning),
text = { Text(description) },
confirmButton = stringResource(R.string.action_confirm),
dismissButton = stringResource(R.string.action_cancel),
title = title,
text = { Text(text) }, // 已经实现好滚动了
confirmButton = confirmButtonText,
dismissButton = dismissButtonText,
onConfirm = {
onConfirm()
onDismiss()
@ -46,49 +49,9 @@ fun WarningDialog(
)
}
@Composable
fun ConfirmDialog(
visible: Boolean,
icon: ImageVector,
title: String,
text: String,
confirmButton: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
properties: DialogProperties = DialogProperties(),
modifier: Modifier = Modifier
) {
val view = LocalView.current
BasicDialog(
visible = visible,
icon = {
Icon(
imageVector = icon,
contentDescription = null // 会跟下面的文本重复,所以设置为 null
)
},
title = { Text(title) },
text = { Text(text) },
confirmButton = {
FilledTonalButton(
onClick = {
VibrationUtils.performHapticFeedback(view)
onConfirm()
onDismiss()
}
) {
Text(confirmButton)
}
},
dismissButton = {},
onDismissRequest = onDismiss,
properties = properties,
modifier = modifier
)
}
@Composable
fun BasicDialog(
modifier: Modifier = Modifier,
visible: Boolean,
icon: ImageVector,
title: String,
@ -97,8 +60,7 @@ fun BasicDialog(
dismissButton: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
properties: DialogProperties = DialogProperties(),
modifier: Modifier = Modifier
properties: DialogProperties = DialogProperties()
) {
val view = LocalView.current
BasicDialog(
@ -110,7 +72,11 @@ fun BasicDialog(
)
},
title = { Text(title) },
text = text,
text = {
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
text?.let { it() }
}
},
confirmButton = {
FilledTonalButton(
onClick = {
@ -139,6 +105,7 @@ fun BasicDialog(
@Composable
fun BasicDialog(
modifier: Modifier = Modifier,
visible: Boolean,
icon: @Composable (() -> Unit)? = null,
title: @Composable () -> Unit,
@ -146,18 +113,13 @@ fun BasicDialog(
confirmButton: (@Composable () -> Unit),
dismissButton: (@Composable () -> Unit)? = null,
onDismissRequest: () -> Unit,
properties: DialogProperties = DialogProperties(),
modifier: Modifier = Modifier
properties: DialogProperties = DialogProperties()
) {
if (visible) {
AlertDialog(
icon = icon,
title = title,
text = {
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
text?.let { it() }
}
},
text = text,
confirmButton = confirmButton,
dismissButton = dismissButton,
onDismissRequest = onDismissRequest,

View file

@ -38,6 +38,7 @@ import cn.super12138.todo.utils.VibrationUtils
*/
@Composable
fun AnimatedExtendedFloatingActionButton(
modifier: Modifier = Modifier,
icon: ImageVector,
text: String,
textOverflow: TextOverflow = TextOverflow.Clip,
@ -45,8 +46,7 @@ fun AnimatedExtendedFloatingActionButton(
containerColor: Color = FloatingActionButtonDefaults.containerColor,
contentColor: Color = contentColorFor(containerColor),
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
onClick: () -> Unit,
modifier: Modifier = Modifier
onClick: () -> Unit
) {
val view = LocalView.current
FloatingActionButton(

View file

@ -28,9 +28,9 @@ import java.util.concurrent.TimeUnit
@Composable
fun Konfetti(
modifier: Modifier = Modifier,
state: MutableState<Boolean>,
primary: Color = MaterialTheme.colorScheme.primary,
modifier: Modifier = Modifier
primary: Color = MaterialTheme.colorScheme.primary
) {
var visible by state
if (!visible) {

View file

@ -39,6 +39,7 @@ import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LargeTopAppBarScaffold(
modifier: Modifier = Modifier,
title: String,
scrollBehavior: TopAppBarScrollBehavior,
onBack: () -> Unit,
@ -46,7 +47,6 @@ fun LargeTopAppBarScaffold(
floatingActionButton: @Composable () -> Unit = {},
floatingActionButtonPosition: FabPosition = FabPosition.End,
contentWindowInsets: WindowInsets = WindowInsets.safeContent.exclude(WindowInsets.ime),
modifier: Modifier = Modifier,
content: @Composable (PaddingValues) -> Unit
) {
val view = LocalView.current
@ -75,7 +75,8 @@ fun LargeTopAppBarScaffold(
snackbarHost = snackbarHost,
floatingActionButton = floatingActionButton,
floatingActionButtonPosition = floatingActionButtonPosition,
contentWindowInsets = contentWindowInsets
contentWindowInsets = contentWindowInsets,
modifier = modifier
) { innerPadding ->
Box { content(innerPadding) }
}
@ -84,6 +85,7 @@ fun LargeTopAppBarScaffold(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LargeTopAppBarScaffold(
modifier: Modifier = Modifier,
title: @Composable () -> Unit = {},
navigationIcon: @Composable () -> Unit = {},
actions: @Composable RowScope.() -> Unit = {},
@ -92,7 +94,6 @@ fun LargeTopAppBarScaffold(
floatingActionButton: @Composable () -> Unit = {},
floatingActionButtonPosition: FabPosition = FabPosition.End,
contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
modifier: Modifier = Modifier,
content: @Composable (PaddingValues) -> Unit
) {
Scaffold(

View file

@ -58,9 +58,9 @@ import cn.super12138.todo.logic.model.Subjects
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
import cn.super12138.todo.ui.components.ChipItem
import cn.super12138.todo.ui.components.ConfirmDialog
import cn.super12138.todo.ui.components.FilterChipGroup
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.components.WarningDialog
import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
@ -310,10 +310,10 @@ fun TodoEditorPage(
}
}
WarningDialog(
ConfirmDialog(
visible = showExitConfirmDialog,
icon = Icons.AutoMirrored.Outlined.Undo,
description = stringResource(R.string.tip_discard_changes),
text = stringResource(R.string.tip_discard_changes),
onConfirm = {
showExitConfirmDialog = false
onNavigateUp()
@ -321,10 +321,10 @@ fun TodoEditorPage(
onDismiss = { showExitConfirmDialog = false }
)
WarningDialog(
ConfirmDialog(
visible = showDeleteConfirmDialog,
icon = Icons.Outlined.Delete,
description = stringResource(R.string.tip_delete_task, 1),
text = stringResource(R.string.tip_delete_task, 1),
onConfirm = onDelete,
onDismiss = { showDeleteConfirmDialog = false }
)

View file

@ -38,7 +38,7 @@ import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.database.TodoEntity
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
import cn.super12138.todo.ui.components.WarningDialog
import cn.super12138.todo.ui.components.ConfirmDialog
import cn.super12138.todo.ui.pages.main.components.TodoTopAppBar
import cn.super12138.todo.ui.viewmodels.MainViewModel
@ -220,10 +220,10 @@ fun MainPage(
}
}
WarningDialog(
ConfirmDialog(
visible = showDeleteConfirmDialog,
icon = Icons.Outlined.Delete,
description = stringResource(R.string.tip_delete_task, selectedTodoIds.size),
text = stringResource(R.string.tip_delete_task, selectedTodoIds.size),
onConfirm = { viewModel.deleteSelectedTodo() },
onDismiss = { showDeleteConfirmDialog = false }
)

View file

@ -139,7 +139,6 @@ fun SettingsData(
icon = Icons.Outlined.RestartAlt,
title = stringResource(R.string.tip_tips),
text = stringResource(R.string.tip_restore_success),
confirmButton = stringResource(R.string.action_confirm),
onConfirm = { restartApp(context) },
onDismiss = { showRestoreDialog = false },
properties = DialogProperties(dismissOnBackPress = false, dismissOnClickOutside = false)