Firebase addListenerForSingleValueEvent datasnapshot возвращает ноль - PullRequest
2 голосов
/ 22 апреля 2020

Я пытаюсь выполнить вход в систему, используя базу данных Firebase в реальном времени.

Моя база данных заполняется, как показано ниже при регистрации:

screenshot of the database structure

После подписания Я хочу инициализировать пользователя publi c stati c, чтобы я мог получить его в своей основной деятельности и соответствующим образом обновить пользовательский интерфейс, но dataSnapshop объекта ValueEventListener возвращает ноль.

Вот код моего addListenerForSingleValueEvent:

currentUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        currentUserUsername = dataSnapshot.child("/username").getValue(String.class);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        currentUserUsername = "ERROR";
    }

});

// Get every information into a User class
MainActivity.CURRENT_USER_SESSION = new User(
        currentUserUsername,
        user.getEmail(),
        user.getUid()
);

У любого есть идея, чтобы помочь мне. Или какой-нибудь обходной путь или совет, чтобы сделать это лучше?

Редактировать: ниже приведена инициализация currentUserReference

currentUserReference = database.getReference("users/" + user.getUid());

, когда база данных инициализируется в onCreate следующим образом:

database = FirebaseDatabase.getInstance();

"пользователь", от которого я получаю Uid, - это FirebaseUser, который возвращается firebaseAuth.getCurrentUser после проверки, был ли signInWithEmailAndPassword.addOnCompleteListener успешным.

и после addListenerForSingleValueEvent я добавил Log.d, который написан следующим образом:

Log.d(TAG, "Value of variable: " + currentUserUsername);

Я ожидаю, что currentUserUsername будет иметь значение «username» в назначенной базе данных, но вместо этого , Я получаю:

LoginActivity: значение переменной: null

Edit2: во время отладки я понял, что когда отладчик достигает .addListenerForSingleValueEvent и я нажимаю F8, он полностью пропускает этот метод. Итак, как кто-то сказал в комментарии, datasnapshot, вероятно, не является нулевым, к нему никогда не осуществляется доступ. Но я до сих пор не понимаю, почему.

1 Ответ

1 голос
/ 23 апреля 2020

dataSnapshot.getValue (String.class) не возвращает ноль, когда вы выходите из onDataChange, ваше currentUserUsername повторно инициализируется.

Таким образом, чтобы передать значение следующему действию, вам нужно:

currentUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            currentUserUsername = dataSnapshot.getValue(String.class);
            // Get every information into a User class
            MainActivity.CURRENT_USER_SESSION = new User(
                    currentUserUsername,
                    user.getEmail(),
                    user.getUid()
            );
            Intent intent = new Intent(
                    LoginActivity.this, MainActivity.class);
            startActivity(intent);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...