Скорее всего, данные просто еще не были загружены при вызове getUserSnap
.Чтобы убедиться в этом, добавьте еще несколько операторов журнала:
Log.i(TAG, "Starting to read from database.")
userRef.addValueEventListener(object : ValueEventListener {
override fun onCancelled(e: DatabaseError) {
Log.e(TAG, "Data could not be retrieved from Database." + e.message)
}
override fun onDataChange(snap: DataSnapshot) { // is never executed
Log.i(TAG, "User read from database.")
userSnap = snap
}
})
public fun getUserSnap(): DataSnapshot {
Log.i(TAG, "Getting user.")
return userSnap // returns null
}
Когда вы запустите свое приложение с этим, результат будет:
Начало чтения из базы данных.
Получение пользователя.
Чтение пользователем из базы данных.
Вероятно, это не тот порядок, который вы ожидали.Firebase загружает данные из базы данных асинхронно, поскольку для получения результатов может потребоваться некоторое время.Вместо того, чтобы заставлять ваше приложение ждать (что вызовет диалоговое окно «Приложение не отвечает»), вашему коду разрешено продолжать.Но когда вы звоните getUserSnap
, этот пользователь еще не был загружен.
Самое простое решение - переместить весь код, которому требуется доступ для пользователя , в onDataChange()
.метод.Также см. Мой ответ на этот вопрос для более гибкого решения, которое требует больше кода: Метод getContactsFromFirebase () возвращает пустой список