修复添加Agent时取消选择头像后数据被清空的问题

- 引入`isSelectingAvatar`状态来标记是否正在选择头像。
- 当用户从图片裁剪页面返回或取消选择时,不再清空`AddAgentViewModel`中的数据。
- 仅当用户从`AddAgent`页面返回(并且不是在选择头像的过程中)时,才清空已填写的数据。
- 调整了`AddAgent`页面的返回逻辑,以确保在选择头像过程中返回时数据得以保留。
This commit is contained in:
2025-09-03 11:05:12 +08:00
parent db85deea96
commit 288728f142
3 changed files with 62 additions and 10 deletions

View File

@@ -25,6 +25,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.activity.compose.BackHandler
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@@ -44,6 +45,14 @@ import com.aiosman.ravenow.ui.account.AccountEditViewModel
import com.aiosman.ravenow.ui.comment.NoticeScreenHeader import com.aiosman.ravenow.ui.comment.NoticeScreenHeader
import com.aiosman.ravenow.ui.comment.ScreenHeader import com.aiosman.ravenow.ui.comment.ScreenHeader
import com.aiosman.ravenow.ui.comment.ScreenHeader2 import com.aiosman.ravenow.ui.comment.ScreenHeader2
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Row
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import com.aiosman.ravenow.ui.composables.ActionButton import com.aiosman.ravenow.ui.composables.ActionButton
import com.aiosman.ravenow.ui.composables.CustomAsyncImage import com.aiosman.ravenow.ui.composables.CustomAsyncImage
import com.aiosman.ravenow.ui.composables.StatusBarSpacer import com.aiosman.ravenow.ui.composables.StatusBarSpacer
@@ -89,11 +98,18 @@ fun AddAgentScreen() {
} }
// 页面退出时清空数据 // 处理系统返回键
DisposableEffect(Unit) { BackHandler {
onDispose { // 如果不是在选择头像过程中,则清空数据
if (!model.isSelectingAvatar) {
model.clearData() model.clearData()
} }
navController.popBackStack()
}
// 页面进入时重置头像选择状态
LaunchedEffect(Unit) {
model.isSelectingAvatar = false
} }
Column( Column(
@@ -107,18 +123,46 @@ fun AddAgentScreen() {
modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp) modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp)
.background(color = appColors.decentBackground) .background(color = appColors.decentBackground)
) { ) {
ScreenHeader2 ( // 自定义header控制返回按钮行为
title = stringResource(R.string.agent_add), Row(
moreIcon = false modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) { ) {
Image(
painter = painterResource(id = R.drawable.rider_pro_back_icon),
contentDescription = "返回",
modifier = Modifier.size(24.dp).clickable(
indication = null,
interactionSource = remember { MutableInteractionSource() }
) {
// 与BackHandler保持一致的逻辑
if (!model.isSelectingAvatar) {
model.clearData()
}
navController.navigateUp()
},
colorFilter = ColorFilter.tint(appColors.text)
)
Spacer(modifier = Modifier.size(12.dp))
Text(
stringResource(R.string.agent_add),
fontWeight = FontWeight.W600,
modifier = Modifier.weight(1f),
textAlign = TextAlign.Center,
fontSize = 17.sp,
color = appColors.text
)
Spacer(modifier = Modifier.size(12.dp))
Icon( Icon(
modifier = Modifier modifier = Modifier
.size(24.dp) .size(24.dp)
.noRippleClickable { .noRippleClickable {
// 提交创建智能体的逻辑可以在这里实现
}, },
imageVector = Icons.Default.Check, imageVector = Icons.Default.Check,
contentDescription = "Add") contentDescription = "Add",
tint = appColors.text
)
} }
} }
Spacer(modifier = Modifier.height(44.dp)) Spacer(modifier = Modifier.height(44.dp))
@@ -146,6 +190,8 @@ fun AddAgentScreen() {
.background(appColors.main) .background(appColors.main)
.align(Alignment.BottomEnd) .align(Alignment.BottomEnd)
.noRippleClickable { .noRippleClickable {
// 设置正在选择头像的标志
model.isSelectingAvatar = true
navController.navigate(NavigationRoute.AgentImageCrop.route) navController.navigate(NavigationRoute.AgentImageCrop.route)
}, },
contentAlignment = Alignment.Center contentAlignment = Alignment.Center

View File

@@ -23,7 +23,7 @@ object AddAgentViewModel : ViewModel() {
var desc by mutableStateOf("") var desc by mutableStateOf("")
var croppedBitmap by mutableStateOf<Bitmap?>(null) var croppedBitmap by mutableStateOf<Bitmap?>(null)
var isUpdating by mutableStateOf(false) var isUpdating by mutableStateOf(false)
var isFromAddAgent by mutableStateOf(false) var isSelectingAvatar by mutableStateOf(false) // 标记是否正在选择头像
suspend fun updateAgentAvatar(context: Context) { suspend fun updateAgentAvatar(context: Context) {
croppedBitmap?.let { croppedBitmap?.let {
@@ -83,6 +83,6 @@ object AddAgentViewModel : ViewModel() {
desc = "" desc = ""
croppedBitmap = null croppedBitmap = null
isUpdating = false isUpdating = false
isFromAddAgent = false isSelectingAvatar = false
} }
} }

View File

@@ -83,6 +83,8 @@ fun AgentImageCropScreen() {
} }
} }
if (uri == null) { if (uri == null) {
// 用户取消选择图片,重置标志
AddAgentViewModel.isSelectingAvatar = false
navController.popBackStack() navController.popBackStack()
} }
} }
@@ -119,6 +121,8 @@ fun AgentImageCropScreen() {
painter = painterResource(R.drawable.rider_pro_back_icon), painter = painterResource(R.drawable.rider_pro_back_icon),
contentDescription = null, contentDescription = null,
modifier = Modifier.clickable { modifier = Modifier.clickable {
// 用户取消头像选择,重置标志
AddAgentViewModel.isSelectingAvatar = false
navController.popBackStack() navController.popBackStack()
}, },
colorFilter = ColorFilter.tint(Color.White) colorFilter = ColorFilter.tint(Color.White)
@@ -134,6 +138,8 @@ fun AgentImageCropScreen() {
if (croppedBitmap != null) { if (croppedBitmap != null) {
// 如果已经有裁剪结果,直接返回 // 如果已经有裁剪结果,直接返回
AddAgentViewModel.croppedBitmap = croppedBitmap AddAgentViewModel.croppedBitmap = croppedBitmap
// 重置头像选择标志
AddAgentViewModel.isSelectingAvatar = false
AddAgentViewModel.viewModelScope.launch { AddAgentViewModel.viewModelScope.launch {
AddAgentViewModel.updateAgentAvatar(context) AddAgentViewModel.updateAgentAvatar(context)
navController.popBackStack() navController.popBackStack()