Android Method总是从Firestore数据库查询返回false
我有一个方法可以检查列表是否包含用户。由于某些原因,它总是返回false,即使用户在列表中。该函数确实有效,我知道它确实找到了用户,只是不确定为什么它除了Android Method总是从Firestore数据库查询返回false,android,firebase,kotlin,google-cloud-firestore,Android,Firebase,Kotlin,Google Cloud Firestore,我有一个方法可以检查列表是否包含用户。由于某些原因,它总是返回false,即使用户在列表中。该函数确实有效,我知道它确实找到了用户,只是不确定为什么它除了false之外不返回任何其他内容 我知道它是有效的,因为我有另一个方法使用这个代码片段来检查用户是否在列表中,并删除或添加他们。这是有效的,所以我知道这是拉名单 方法: fun checkUserChatChannel(channelId: String): Boolean { var list = mutableListOf<S
false
之外不返回任何其他内容
我知道它是有效的,因为我有另一个方法使用这个代码片段来检查用户是否在列表中,并删除或添加他们。这是有效的,所以我知道这是拉名单
方法:
fun checkUserChatChannel(channelId: String): Boolean {
var list = mutableListOf<String>()
val currentUserId = FirebaseAuth.getInstance().currentUser!!.uid
var bool = false
chatChannelsCollectionRef.document(channelId).get().addOnSuccessListener {
if (it.exists()) {
list = it.get("userIds") as MutableList<String>
if(list.contains(currentUserId)){
bool = true
}
}
}
return bool
}
但按钮将始终保持在“加入”状态:
这是我使用的另一种方法,因此我知道代码可以从列表中删除用户(与问题无关):
fun组(channelId:String){
currentUserDocRef.collection(“EngagedChatChannel”).文档(channelId)
1.删除()
var list=mutableListOf()
val currentUserId=FirebaseAuth.getInstance().currentUser!!.uid
chatChannelsCollectionRef.document(channelId).get().addOnSuccessListener{
if(it.exists()){
list=it.get(“userid”)为可变列表
if(list.contains(currentUserId)){
list.remove(currentUserId)
}
}
val newChannel=chatchchannelscollectionref.document(channelId)
newChannel.set(GChatChannel(channelId,list))
}
}
Firebase API是异步的
,这意味着onSucces()
函数在调用后立即返回,它返回的任务的回调将在稍后调用。无法保证需要多长时间。因此,在数据可用之前,可能需要几百毫秒到几秒钟的时间。由于该方法立即返回,因此您尝试返回的bool
变量的值还没有从回调中填充
基本上,您尝试从异步API同步返回一个值。那不是个好主意。您应该按照预期异步处理API
这个问题的一个快速解决方法是在回调中使用bool
变量的值。这也意味着您需要更改您的checkUserChatChannel
,而不是返回一个布尔值以返回void,否则我建议您查看我的anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成
boolean inOut = FirestoreUtil.INSTANCE.checkUserChatChannel(moduleId);
if(!inOut)
{
JLChat.setText("Join");
}
else
{
JLChat.setText("Leave");
}
fun LeaveGroup(channelId: String) {
currentUserDocRef.collection("engagedChatChannels").document(channelId)
.delete()
var list = mutableListOf<String>()
val currentUserId = FirebaseAuth.getInstance().currentUser!!.uid
chatChannelsCollectionRef.document(channelId).get().addOnSuccessListener {
if (it.exists()) {
list = it.get("userIds") as MutableList<String>
if(list.contains(currentUserId)){
list.remove(currentUserId)
}
}
val newChannel = chatChannelsCollectionRef.document(channelId)
newChannel.set(GChatChannel(channelId,list))
}
}