Является ли removeEventListener () не частью Firebase Firestore? - PullRequest
3 голосов
/ 10 января 2020

Я получаю ошибку в моем методе onPause(), который гласит:

Cannot resolve method 'removeEventListener(com.google.firebase.database.ValueEventListener)'

Полагаю, я мог допустить некоторые ошибки при попытке преобразовать этот учебник (где приложение показывает, видел ли получатель сообщения сообщение или нет) из базы данных Firebase Realtime в Firebase Firestore.

Объявление ValueEventListener происходит перед методом onCreate ()

ValueEventListener seenListener;

Метод seenMessage ()

private void seenMessage(final String recipientId){
        final CollectionReference reference = FirebaseFirestore.getInstance().collection("chats");
        seenListener = (ValueEventListener) reference.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
                if(documentSnapshots!=null){
                    for(QueryDocumentSnapshot queryDocumentSnapshots : documentSnapshots){
                        Chat chat = queryDocumentSnapshots.toObject(Chat.class);
                        if (chat.getReceiver().equals(userId) && chat.getSender().equals(recipientId)){
                            HashMap<String, Object> hashMap = new HashMap<>();
                            hashMap.put("isseen", true);
                            reference.add(hashMap);
                        }
                    }
                }
            }
        });
    }

Метод onPause ()

@Override
    protected void onPause() {
        super.onPause();
        FirebaseFirestore.getInstance().collection("chats").removeEventListener(seenListener);
    }

Ответы [ 2 ]

1 голос
/ 10 января 2020

Разве removeEventListener () не является частью Firebase Firestore?

Нет, это не так. Следующая строка кода:

reference.addSnapshotListener(new EventListener<QuerySnapshot>() {/* ... */}

Возвращает объект ListenerRegistration , и нет способа в Java, в котором вы можете привести этот тип объекта к ValueEventListener объект. ValueEventListener является частью базы данных Firebase Realtime, а Cloud Firestore - это совершенно другой продукт.

Как я вижу в вашем коде, вы используете Cloud Firestore. Если вы хотите удалить слушателя, пожалуйста, смотрите мой ответ из следующего поста:

0 голосов
/ 10 января 2020

Вы объявляете eventListener внутри метода:

private void seenMessage(final String recipientId){
    EventListener<DocumentSnapshot> eventListener = new EventListener<DocumentSnapshot>() { ... }
    ...
}

Это означает, что переменная eventListner будет видна только другому коду внутри этого метода. Вы пытаетесь получить к нему доступ eventListener вне этого метода, что java не позволяет. Это называется «переменная область видимости». eventListener "ограничен" для метода seenMethod, который является единственным местом, на которое можно ссылаться.

Вместо этого вы можете объявить и назначить eventListener вне метода как переменную-член класса , Затем вы можете использовать его любым способом, например listenerRegistration.

...