Firestore项目删除异常:点击确认后清空全部项,如何实现单选删除?
解决仅删除选中项目的问题
当前所有项目被删除的原因有两个:一是删除函数会批量删除用户的所有项目,二是UI未记录被点击的具体项目ID。以下是具体修改步骤:
1. 修改删除函数,仅删除指定项目
将原有的deleteProjectFromFirestore函数改为接受项目ID参数,直接定位到要删除的文档:
fun deleteProjectFromFirestore(db: FirebaseFirestore, currentUserUid: String, projectId: String, callback: (Boolean) -> Unit) { db.collection("user_projects") .document(currentUserUid) .collection("projects") .document(projectId) .delete() .addOnSuccessListener { Log.d(TAG, "Project deleted") callback(true) } .addOnFailureListener { e -> Log.e(TAG, "Error deleting project", e) callback(false) } }
2. 确保ProjectData包含Firestore文档ID
在获取项目数据时,必须把Firestore文档的ID存入ProjectData对象,否则无法定位到要删除的项目。修改retriveDataFromFirestore函数:
fun retriveDataFromFirestore(db: FirebaseFirestore, currentUserUid: String, callback: (List<ProjectData>) -> Unit) { db.collection("user_projects") .document(currentUserUid) .collection("projects") .get() .addOnSuccessListener { documents -> val projects = documents.map { document -> // 将文档ID注入ProjectData对象(需确保ProjectData有id属性) document.toObject(ProjectData::class.java).apply { id = document.id } } callback(projects) } .addOnFailureListener { e -> Log.e(TAG, "Error retrieving projects", e) callback(emptyList()) } }
同时,在ProjectData类中添加id属性:
data class ProjectData( var id: String = "", // 新增文档ID字段 var title: String? = null, var image: String? = null // 其他原有属性 )
3. 在UI中跟踪选中的项目ID
在AccountScreen中添加状态变量,记录被点击删除的项目ID:
@Composable fun AccountScreen(...) { // ... 原有代码 ... var showDialog by remember { mutableStateOf(false) } // 新增:跟踪选中要删除的项目ID var selectedProjectId by remember { mutableStateOf<String?>(null) } // ... 原有代码 ... }
修改ImageCard的点击事件,将当前项目的ID存入状态:
accountViewModel.ImageCard( painter = imagePainter, contentDescription = null, title = title, onCloseClicked = { selectedProjectId = project.id // 记录当前项目ID showDialog = true } )
4. 调用删除函数时传入选中的项目ID
修改AlertDialog的"是"按钮点击事件,传入选中的项目ID并刷新列表:
if (showDialog) { AlertDialog( // ... 原有属性 ... dismissButton = { Button( onClick = { selectedProjectId?.let { projectId -> accountViewModel.deleteProjectFromFirestore( db, userUid.toString(), projectId // 传入选中的项目ID ) { success -> if (success) { showDialog = false // 删除成功后刷新项目列表 accountViewModel.retriveDataFromFirestore(db, userUid.toString()) { projects -> projectsListState.value = projects } } else { Log.e(TAG, "Project deletion failed") } } } }, // ... 原有样式 ... ) { Text(text = "Yes") } } ) }
这样修改后,点击项目的X图标时会记录该项目的ID,确认删除后仅删除对应ID的项目,并刷新UI显示最新列表。
内容的提问来源于stack exchange,提问作者Valerija
相关产品推荐
相关产品推荐

