Данные загружаются из Firebase асинхронно, так как это может занять некоторое время. Вместо того, чтобы блокировать код во время извлечения данных (что также блокирует использование приложения пользователем), основной код продолжается во время загрузки данных. И затем, когда данные доступны, вызывается ваш onDataChange
.
Вы можете легко увидеть это с некоторыми записями:
Log.d("TAG", "Before starting to load data")
useRef.child(mAuth).addValueEventListener(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
Log.d("TAG", "Got data")
}
override fun onCancelled(error: DatabaseError) {
throw error.toException()
}
})
Log.d("TAG", "After starting to load data")
Когда вы запускаете этот код, он печатает:
Перед началом загрузки данных
После начала загрузки данных
Получил данные
Вероятно, это не тот порядок, который вы ожидали,но это прекрасно объясняет результат, который вы получаете. К моменту запуска val data = ChatModel ( uuid, currentName.toString(), messageText , mAuth, "" )
данные еще не были загружены, поэтому currentName
не имеет значения.
Решение состоит в том, чтобы поместить весь код, которому нужны данные избазы данных внутри метода onDataChange
или для его вызова оттуда.
Так, например:
override fun onDataChange(snapshot: DataSnapshot) {
val uuid = UUID.randomUUID().toString()
val messageText = edt_input.text.toString()
val ref = FirebaseDatabase.getInstance().getReference("message-group/$uuid")
val data = ChatModel ( uuid, currentName.toString(), messageText , mAuth, "" )
ref.setValue(data)
}
См. также: