Mothod всегда возвращает false из запроса БД Firestore - PullRequest
0 голосов
/ 24 октября 2018

У меня есть метод, который проверяет, содержит ли список пользователя или нет.По какой-то причине он всегда возвращает 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 голосов
/ 25 октября 2018

API Firebase имеют значение asynchronous, что означает, что функция onSucces() возвращается сразу после ее вызова, а обратный вызов из Task, который она возвращает, будет вызван через некоторое время.Там нет никаких гарантий о том, сколько времени это займет.Таким образом, получение этих данных может занять от нескольких сотен миллисекунд до нескольких секунд.Поскольку этот метод возвращает немедленно, значение вашей переменной bool, которую вы пытаетесь вернуть, еще не будет заполнено из обратного вызова.

По сути, вы пытаетесь вернуть значение синхронно изAPI это асинхронный.Это не очень хорошая идея.Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.

Быстрое решение этой проблемы - использование значения вашей bool переменной only внутри обратного вызова.Это также означает, что вам нужно изменить checkUserChatChannel вместо возврата логического значения для возврата void, в противном случае я рекомендую вам просмотреть последнюю часть моего ответа из этого поста , в котором яобъяснили, как это можно сделать с помощью пользовательского обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...