Значения меняются , только если вы не ожидаете, что они
Измените сигнатуру метода так, чтобы она передавала обработчик завершений и ничего не возвращала
private fun initlAccount(uid:String, listener:OnCompleteListener) {
...
db.collection("users").document(uid).get().addOnCompleteListener(listener)
} // End of method
Переместите тело слушателя в место, где вы вызываете этот метод, что делает его «обратным вызовом» в другом потоке и, следовательно, «возвращает результаты выполнения»
Примечание: я не знаю Kotlin, но что-то вроде этого
initlAccount("uid-value", OnCompleteListener { it ->
if(it.isSuccessful){
val result = it.result
name = result.getString("Full name")!!
username = result.getString("Username")!!
dob = result.getString("Date of Birth")!!
email = result.getString("Email")!!
var arrtemp = result.get("Friends") as ArrayList<String>
for(str in arrtemp){
friends.add(initlAccount(str)) // Note: This is recursive, and will be an issue
}
arrtemp = result.get("Tasks") as ArrayList<String>
tasks = getTasks(arrtemp)
val acc = Account(uid,username,name,dob,email,tasks,friends)
println(acc.toString())
// Your account is returned here, so you can update a UI element, for example
}
}) // end initlAccount method call
// do NOT use acc here, it will be unassigned or null
И я вижу, что вы делаете рекурсивный вызов, поэтому вы должны либо обработать запрос к базе данных, чтобы сам клиент не находился в бесконечном цикле («дружба» должна быть рефлексивной - userA являетсядруг userB, поэтому получение учетной записи userB вернется к получению друзей userA и продолжится), или вы можете попробовать исследовать операторы RxJava / Kotlin flatMap
.