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

如何在多代码块中复用Firestore生成的requestId实现好友请求删除

解决Firestore好友请求中requestId无法复用的问题

我来帮你搞定这个问题,核心是变量作用域和Firestore异步操作的特性这两个关键点,咱们一步步拆解:

问题根源

  1. 变量作用域限制:你原来的requestid是定义在addOnSuccessListener的回调方法内部的局部变量,这个变量的作用域只限于这个回调方法,外面的第二个if语句根本访问不到它。
  2. 异步操作的逻辑顺序问题:Firestore的add()方法是异步执行的,也就是说,当你执行完第一个if的代码时,回调里的onSuccess还没触发,currentstate的修改也还没完成,这时候第二个if的判断可能不会生效,因为currentstate还是初始的not_friends。

解决方案

1. 提升requestId的作用域

把requestId声明为你的otherProfile类的成员变量,这样整个类的方法都能访问到它:

// 在你的otherProfile类顶部声明成员变量
private String requestId;
private String currentstate = "not_friends"; // 假设初始状态为not_friends

2. 调整逻辑结构,适配异步特性

把两个分支的逻辑放到按钮的点击监听里,用else if替代并列的if,确保每次点击只执行对应状态的操作,避免异步导致的状态不同步。同时补充空判断和错误处理:

// 假设这是你的add按钮的点击监听方法
add.setOnClickListener(v -> {
    if (currentstate.equals("not_friends")) { 
        final Map<String, String> request = new HashMap<>(); 
        request.put("yourid", yourid); 
        request.put("otherid", otherid); 
        request.put("Type", "req_send"); 
        
        fStore.collection("request").add(request)
            .addOnSuccessListener(documentReference -> { 
                Toast.makeText(otherProfile.this, "Versendet", Toast.LENGTH_SHORT).show(); 
                currentstate = "req_send"; 
                add.setEnabled(true); 
                add.setText("Anfrage löschen"); 
                // 把获取到的requestId赋值给成员变量
                requestId = documentReference.getId(); 
                Toast.makeText(otherProfile.this, requestId, Toast.LENGTH_SHORT).show(); 
            })
            .addOnFailureListener(e -> {
                // 补充发送失败的提示
                Toast.makeText(otherProfile.this, "Anfrage senden fehlgeschlagen", Toast.LENGTH_SHORT).show();
            }); 
    } else if (currentstate.equals("req_send")) { 
        // 先判断requestId是否有效,避免空指针
        if (requestId != null && !requestId.isEmpty()) {
            fStore.collection("request").document(requestId)
                .delete()
                .addOnSuccessListener(aVoid -> { 
                    Toast.makeText(otherProfile.this, "Gelöscht", Toast.LENGTH_SHORT).show(); 
                    add.setText("Freundschaftsanfrage versenden"); 
                    currentstate = "not_friends"; 
                    add.setEnabled(true); 
                })
                .addOnFailureListener(e -> { 
                    Toast.makeText(otherProfile.this, "Nö", Toast.LENGTH_SHORT).show(); 
                });
        } else {
            Toast.makeText(otherProfile.this, "Keine gültige Anfrage zum Löschen gefunden", Toast.LENGTH_SHORT).show();
        }
    }
});

3. 额外优化建议

如果用户退出APP再重新进入,成员变量requestId会丢失,导致无法删除之前的请求。你可以把requestId和currentstate一起保存到本地(比如SharedPreferences),或者关联到Firestore的用户文档中,这样重启APP后也能恢复状态。

内容的提问来源于stack exchange,提问作者LEON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:27:37