feat(editor): 在编辑模式下用户修改待办后阻止返回

This commit is contained in:
Super12138 2025-02-06 09:33:47 +08:00
parent de27d5ddb5
commit 40961c70a8
4 changed files with 123 additions and 3 deletions

View file

@ -0,0 +1,73 @@
package cn.super12138.todo.ui.components
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
@Composable
fun BasicDialog(
visible: Boolean,
icon: ImageVector,
title: String,
text: @Composable (() -> Unit)? = null,
confirmButton: String,
dismissButton: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
modifier: Modifier = Modifier
) {
BasicDialog(
visible = visible,
icon = {
Icon(
imageVector = icon,
contentDescription = null // 会跟下面的文本重复,所以设置为 null
)
},
title = {
Text(title)
},
text = text,
confirmButton = {
FilledTonalButton(onClick = onConfirm) {
Text(confirmButton)
}
},
dismissButton = {
TextButton(onClick = onDismiss) {
Text(dismissButton)
}
},
onDismissRequest = onDismiss,
modifier = modifier
)
}
@Composable
fun BasicDialog(
visible: Boolean,
icon: @Composable (() -> Unit)? = null,
title: @Composable () -> Unit,
text: @Composable (() -> Unit)? = null,
confirmButton: (@Composable () -> Unit),
dismissButton: (@Composable () -> Unit)? = null,
onDismissRequest: () -> Unit,
modifier: Modifier = Modifier
) {
if (visible) {
AlertDialog(
icon = icon,
title = title,
text = text,
confirmButton = confirmButton,
dismissButton = dismissButton,
onDismissRequest = onDismissRequest,
modifier = modifier
)
}
}

View file

@ -20,6 +20,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.ErrorOutline
import androidx.compose.material.icons.outlined.Save
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
@ -52,6 +53,7 @@ import cn.super12138.todo.logic.model.Priority
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.BasicDialog
import cn.super12138.todo.ui.components.FilterChipGroup
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
@ -66,8 +68,35 @@ fun TodoEditorPage(
animatedVisibilityScope: AnimatedVisibilityScope,
modifier: Modifier = Modifier
) {
BackHandler { // TODO: 实现用户更改后的阻止返回
onNavigateUp()
var showConfirmDialog by rememberSaveable { mutableStateOf(false) }
fun checkModifiedBeforeBack() {
if (toDo !== null) {
val newTodo = TodoEntity(
content = toDo.content,
subject = toDo.subject,
isCompleted = toDo.isCompleted,
priority = toDo.priority,
id = toDo.id
)
/*val newTodo = TodoEntity( // TODO: 只要用户有修改就阻止返回(当前是在编辑状态下检测)
content = toDo?.content ?: "",
subject = toDo?.subject ?: 0,
isCompleted = toDo?.isCompleted ?: false,
priority = toDo?.priority ?: 0f,
id = toDo?.id ?: 0
)*/
if (newTodo !== toDo) {
showConfirmDialog = true
} else {
onNavigateUp()
}
} else {
onNavigateUp()
}
}
BackHandler {
checkModifiedBeforeBack()
}
val context = LocalContext.current
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
@ -131,7 +160,9 @@ fun TodoEditorPage(
}
}
},
onBack = onNavigateUp,
onBack = {
checkModifiedBeforeBack()
},
modifier = modifier
) { innerPadding ->
Column(
@ -225,4 +256,18 @@ fun TodoEditorPage(
Spacer(Modifier.size(40.dp))
}
}
BasicDialog(
visible = showConfirmDialog,
icon = Icons.Outlined.ErrorOutline,
title = stringResource(R.string.title_warning),
text = { Text(stringResource(R.string.tip_discard_changes)) },
confirmButton = stringResource(R.string.action_confirm),
dismissButton = stringResource(R.string.action_cancel),
onConfirm = {
showConfirmDialog = false
onNavigateUp()
},
onDismiss = { showConfirmDialog = false }
)
}

View file

@ -81,4 +81,5 @@
<string name="pref_category_todo_list">待办列表</string>
<string name="pref_view_on_github">在 GitHub 上查看</string>
<string name="pref_view_on_github_desc">查看源代码、提交错误报告和改进建议</string>
<string name="tip_discard_changes">退出编辑后将无法找回你修改过的数据。确定退出编辑吗?</string>
</resources>

View file

@ -82,4 +82,5 @@
<string name="pref_category_todo_list">To-Do List</string>
<string name="pref_view_on_github">View On GitHub</string>
<string name="pref_view_on_github_desc">View source code, submit bug reports, and improvement suggestions</string>
<string name="tip_discard_changes">After exiting edit mode, you will not be able to retrieve the data you have modified. Are you sure you want to exit editing?</string>
</resources>