You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:13:13