如何在多代码块中复用Firestore生成的requestId实现好友请求删除
解决Firestore好友请求中requestId无法复用的问题
我来帮你搞定这个问题,核心是变量作用域和Firestore异步操作的特性这两个关键点,咱们一步步拆解:
问题根源
- 变量作用域限制:你原来的
requestid是定义在addOnSuccessListener的回调方法内部的局部变量,这个变量的作用域只限于这个回调方法,外面的第二个if语句根本访问不到它。 - 异步操作的逻辑顺序问题: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
相关产品推荐
相关产品推荐

