Android Method总是从Firestore数据库查询返回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,即使用户在列表中。该函数确实有效,我知道它确实找到了用户,只是不确定为什么它除了
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))
    }
}