[img]https://i. sstatic.net/53X8R5lH.png[/img]
Как видите, есть коллекция с именем «Пользователи» и два пользователя, и теперь я нажимаю на одного, и вы видите поля и их значения. значения.
Мне нужно получить данные из документов (значения полей) и использовать их для своего приложения. Это то, что легко сделать в Java с помощью переменной класса. член. Однако с Kotlin я не могу этого сделать, поэтому я не могу получить нужные данные за пределами метода addOnColeteListener (я использую его следующим образом: db.collection().document().get ().addOnCompleteListener{ // делаем что-то для получения данных , см. код ниже).
Код: Выделить всё
class MainActivity : ComponentActivity() {
@RequiresApi(Build.VERSION_CODES.Q)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApplicationTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
val notificationsDatabase: DatabaseReference = FirebaseDatabase.getInstance().getReference()
val numberOfNotifications: Int = setNotifications(notificationsDatabase)
var currentUser: UserInfo
val mapOfUser: MutableMap = emptyMap().toMutableMap()
var dataSets = listOf()
setUserInfo { user ->
currentUser = UserInfo().copy(
firstname = user.firstname,
lastname = user.lastname,
email = user.email,
phoneNumber = user.phoneNumber,
gender = user.gender,
moreInfo = user.moreInfo,
uri = user.uri
)
logMessage("outsideCurrentUserIs", currentUser.toString())
}
// logMessage("outsideCurrentUserIs", currentUser.toString())
MainBody(
UserInfo(
firstname="Emmanuel",
lastname="Agyapong",
email="xyz@google.com",
phoneNumber="1234567890",
gender="Male",
moreInfo="An incoming software engineer who's madly in love with Android :)",
uri="https://firebasestorage.googleapis.com/v0/b/bookme-dc582.appspot.com/o/meAtBCC.jpg?alt=media&token=3d9b481c-9880-445f-939f-3b7bb60f3cbd"
),
numberOfNotifications
)
}
}
}
}
}
private fun setUserInfo (callBack: (UserInfo) -> Unit) {
val firebaseFirestoreInstance = FirebaseAuth.getInstance()
val database: FirebaseFirestore = FirebaseFirestore.getInstance()
database.collection("Users")
.document(firebaseFirestoreInstance.uid.toString())
.get()
.addOnCompleteListener { task ->
if (task.successful) {
val u: UserInfo = UserInfo().copy(
firstname = task.result.data!!["firstname"].toString(),
lastname = task.result.data!!["lastname"].toString(),
email = task.result.data!!["email"].toString(),
phoneNumber = task.result.data!!["phone"].toString(),
gender = task.result.data!!["gender"].toString(),
moreInfo = task.result.data!!["moreInfo"].toString(),
uri = task.result.data!!["profileImage"].toString()
)
callBack(u)
} else {
Log.d(TAG, "Cached get failed: ", task.exception)
}
}
}
РЕДАКТИРОВАТЬ:
Я добавил две картинки, чтобы @Frank van Puffelen мог их видеть. Я определил локальную переменную (currentUser = UserInfo()) и присвоил ей значения пользователя в базе данных через addOnCompleteListener{ currentUser = UserInfo().copy(...)} и напечатал ее дважды. Результаты есть, внутри копии прослушивателя я вижу извлекаемые значения, но снаружи они пусты, как если бы переменная была определена без значений.
печать carrentUser внутри addOnCompleteListener{}
currentUser печатает вне addOnCompleteListener{}
То же самое происходит с addSuccessfulListener{}.
Подробнее здесь: https://stackoverflow.com/questions/787 ... efirestore