Android ошибка инкапсуляции при чтении в Firestore - PullRequest
0 голосов
/ 02 августа 2020

Я установил метод получения в моем ViewModel, чтобы получить поле типа Long с именем cWeek. Когда я использую value.getLong внутри addSnapshotListener, он работает и возвращает значение из базы данных, но когда я пытаюсь вернуть его, переменная равна нулю. Я серьезно не знаю, что искать для решения этой проблемы.

Getter

// this var is initialized in global scope
Long cWeek = getCWeek();

public Long getCWeek() {
        new References()
                .getUserRefDoc()
                .addSnapshotListener(new EventListener<DocumentSnapshot>() {
                    @Override
                    public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            Log.d(TAG, "Could not get cWeek data " + e);
                        }
                        Long var = (Long) value.get("cWeek");

                        cWeek = var;
                        Log.d(TAG, "cWeek: " + cWeek);
                    }
                });
        Log.d(TAG, "cWeek AFTER: " + cWeek);
        return cWeek;
    }

Logcat:

D/DashboardViewModel: cWeek AFTER: null
D/DashboardViewModel: cWeek: 1

1 Ответ

1 голос
/ 02 августа 2020

addSnapshotListener является асинхронным и возвращается немедленно, прежде чем запрос будет завершен. Предоставляемый вами обратный вызов вызывается через некоторое время. Тем временем ваш код продолжает выполняться, и начальное значение cWeek возвращается, пока запрос все еще выполняется.

Если вы хотите предоставить результаты запроса Firestore (или любой асинхронной функции) из ViewModel, вы должны вернуть LiveData, который предоставит окончательный результат. Вызывающий может наблюдать ViewModel на предмет результата, который будет получен, когда он будет готов.

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