我有一种检查列表是否包含用户的方法。由于某种原因,即使用户在列表中,它也总是返回false。该函数确实有效,我知道它确实找到了用户,只是不确定为什么除了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
}
通话:
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))
}
}
答案 0 :(得分:2)
Firebase API为asynchronous
,这意味着onSucces()
函数在被调用后立即返回,而从其返回的Task
的回调将在一段时间后被调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试从您的bool
变量中返回值。
基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。
此问题的快速解决方案是在回调中仅使用bool
变量的值仅。这也意味着您需要更改checkUserChatChannel
而不是返回布尔值以返回void,否则我建议您从此 post 中查看anwser的最后一部分,其中我已经说明了如何使用自定义回调来实现。