refactor: 重构代码

This commit is contained in:
Super12138 2025-06-27 09:09:22 +08:00
parent 63665c64a3
commit 28763176cf
5 changed files with 113 additions and 65 deletions

View file

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

View file

@ -102,17 +102,11 @@ fun TodoNavigation(
} }
composable(TodoScreen.SettingsAppearance.name) { composable(TodoScreen.SettingsAppearance.name) {
SettingsAppearance( SettingsAppearance(onNavigateUp = { navController.navigateUp() })
viewModel = viewModel,
onNavigateUp = { navController.navigateUp() }
)
} }
composable(TodoScreen.SettingsInterface.name) { composable(TodoScreen.SettingsInterface.name) {
SettingsInterface( SettingsInterface(onNavigateUp = { navController.navigateUp() })
viewModel = viewModel,
onNavigateUp = { navController.navigateUp() }
)
} }
composable(TodoScreen.SettingsData.name) { composable(TodoScreen.SettingsData.name) {

View file

@ -1,12 +1,10 @@
package cn.super12138.todo.ui.pages.editor package cn.super12138.todo.ui.pages.editor
import android.view.HapticFeedbackConstants
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.AnimatedVisibilityScope import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.animation.ExperimentalSharedTransitionApi import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionScope import androidx.compose.animation.SharedTransitionScope
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -16,8 +14,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@ -25,11 +21,7 @@ import androidx.compose.material.icons.automirrored.outlined.Undo
import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.Save import androidx.compose.material.icons.outlined.Save
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Label
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
@ -48,16 +40,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.LiveRegionMode
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.liveRegion
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.stateDescription
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.database.TodoEntity import cn.super12138.todo.logic.database.TodoEntity
import cn.super12138.todo.logic.model.Priority
import cn.super12138.todo.logic.model.Subjects import cn.super12138.todo.logic.model.Subjects
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton import cn.super12138.todo.ui.components.AnimatedExtendedFloatingActionButton
@ -65,6 +51,8 @@ import cn.super12138.todo.ui.components.ChipItem
import cn.super12138.todo.ui.components.ConfirmDialog import cn.super12138.todo.ui.components.ConfirmDialog
import cn.super12138.todo.ui.components.FilterChipGroup import cn.super12138.todo.ui.components.FilterChipGroup
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.pages.editor.components.TodoContentTextField
import cn.super12138.todo.ui.pages.editor.components.TodoPrioritySlider
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
@ -175,16 +163,10 @@ fun TodoEditorPage(
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
with(sharedTransitionScope) { with(sharedTransitionScope) {
TextField( TodoContentTextField(
value = toDoContent, value = toDoContent,
onValueChange = { toDoContent = it }, onValueChange = { toDoContent = it },
label = { Text(stringResource(R.string.placeholder_add_todo)) },
isError = isErrorContent, isError = isErrorContent,
supportingText = {
AnimatedVisibility(isErrorContent) {
Text(stringResource(R.string.error_no_content_entered))
}
},
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.sharedBounds( .sharedBounds(
@ -251,42 +233,9 @@ fun TodoEditorPage(
Spacer(Modifier.size(5.dp)) Spacer(Modifier.size(5.dp))
val priorityName = TodoPrioritySlider(
Priority.entries.map { it.getDisplayName(context) } // 要不要用 remember 呢
val interactionSource = remember { MutableInteractionSource() }
Slider(
modifier = Modifier.semantics {
contentDescription =
context.getString(R.string.label_priority) + priorityName[Priority.fromFloat(
priorityState
).ordinal]
stateDescription = priorityName[Priority.fromFloat(priorityState).ordinal]
liveRegion = LiveRegionMode.Polite
},
value = priorityState, value = priorityState,
onValueChange = { onValueChange = { priorityState = it },
VibrationUtils.performHapticFeedback(view, HapticFeedbackConstants.LONG_PRESS)
priorityState = it
},
valueRange = -2f..2f,
steps = 3,
interactionSource = interactionSource,
thumb = {
Label(
label = {
PlainTooltip(
modifier = Modifier
.sizeIn(45.dp, 25.dp)
.wrapContentWidth()
) {
Text(priorityName[Priority.fromFloat(priorityState).ordinal])
}
},
interactionSource = interactionSource
) {
SliderDefaults.Thumb(interactionSource)
}
}
) )
Spacer(Modifier.size(10.dp)) Spacer(Modifier.size(10.dp))

View file

@ -0,0 +1,30 @@
package cn.super12138.todo.ui.pages.editor.components
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import cn.super12138.todo.R
@Composable
fun TodoContentTextField(
value: String,
onValueChange: (String) -> Unit,
isError: Boolean,
modifier: Modifier = Modifier
) {
TextField(
value = value,
onValueChange = onValueChange,
label = { Text(stringResource(R.string.placeholder_add_todo)) },
isError = isError,
supportingText = {
AnimatedVisibility(isError) {
Text(stringResource(R.string.error_no_content_entered))
}
},
modifier = modifier
)
}

View file

@ -0,0 +1,75 @@
package cn.super12138.todo.ui.pages.editor.components
import android.view.HapticFeedbackConstants
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Label
import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.semantics.LiveRegionMode
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.liveRegion
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.stateDescription
import androidx.compose.ui.unit.dp
import cn.super12138.todo.R
import cn.super12138.todo.logic.model.Priority
import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TodoPrioritySlider(
value: Float,
onValueChange: (Float) -> Unit,
modifier: Modifier = Modifier
) {
val view = LocalView.current
val context = LocalContext.current
val priorityName = remember { Priority.entries.map { it.getDisplayName(context) } }
val interactionSource = remember { MutableInteractionSource() }
Slider(
value = value,
onValueChange = {
VibrationUtils.performHapticFeedback(view, HapticFeedbackConstants.LONG_PRESS)
onValueChange(it)
},
valueRange = -2f..2f,
steps = 3,
interactionSource = interactionSource,
thumb = {
Label(
label = {
PlainTooltip(
modifier = Modifier
.sizeIn(45.dp, 25.dp)
.wrapContentWidth()
) {
Text(priorityName[Priority.fromFloat(value).ordinal])
}
},
interactionSource = interactionSource
) {
SliderDefaults.Thumb(interactionSource)
}
},
modifier = modifier.semantics {
contentDescription =
context.getString(R.string.label_priority) + priorityName[Priority.fromFloat(
value
).ordinal]
stateDescription = priorityName[Priority.fromFloat(value).ordinal]
liveRegion = LiveRegionMode.Polite
}
)
}