Mothod始终会从Firestore数据库查询中返回false

时间:2018-10-24 15:21:26

标签: android firebase kotlin google-cloud-firestore

我有一种检查列表是否包含用户的方法。由于某种原因,即使用户在列表中,它也总是返回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))
    }
}

1 个答案:

答案 0 :(得分:2)

Firebase API为asynchronous,这意味着onSucces()函数在被调用后立即返回,而从其返回的Task的回调将在一段时间后被调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试从您的bool变量中返回值。

基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。

此问题的快速解决方案是在回调中仅使用bool变量的值。这也意味着您需要更改checkUserChatChannel而不是返回布尔值以返回void,否则我建议您从此 post 中查看anwser的最后一部分,其中我已经说明了如何使用自定义回调来实现。