Благодаря подсказкам @Frank van Puffelen я смог отладить код.Из того, что я исследовал, следующий код является классическим подходом к решению этого типа проблемы.Возможно, кто-то найдет это полезным.
Шаг 1 .Определите функциональный интерфейс с параметром того же типа, что и примитивное значение или объект, который вы хотите вернуть из асинхронной операции.
interface OnMetaReturnedListener{
fun onMetaReturned(colExists: Boolean)
}
Шаг 2 .Создайте метод, передавая ссылку на интерфейс в качестве аргумента.Этот метод будет выполнять синхронную операцию.После получения значения вызовите метод функционального интерфейса и передайте полученное значение / объект в качестве аргумента метода.
private fun nameExists(metaReturnedListener: OnMetaReturnedListener, colName: String){
val userId = fbAuth!!.uid!!
val docRefB: DocumentReference = fbDb!!.collection("users")
.document(userId)
.collection("finalGrades")
.document(colName)
docRefB.get().addOnCompleteListener { task ->
if (task.isSuccessful) {
val doc: DocumentSnapshot = task.result!!
val colExists = doc.exists()
metaReturnedListener.onMetaReturned(colExists)
} else {
Log.d(TAG, "get failed with ", task.exception)
}
}
}
Шаг 3 .Вызовите метод, определенный на шаге 2. Передайте объект, который вы определили на шаге 1. Этот объект будет вызываться из метода на шаге 2, поэтому переопределенный метод получит значение / объект в качестве параметра, который затем можно назначить дляпеременная того же типа.Вы также можете передавать другие параметры других типов, но вы должны обновить сигнатуру метода в шаге 2
fun saveModulesToFirestore(colName: String, saveCode: String) {
var collectionExists = false
if (saveCode == FirebaseHelper.ADD_TO_COLLECTION){
nameExists(object: OnMetaReturnedListener{
override fun onMetaReturned(colExists: Boolean) {
collectionExists = colExists
if (collectionExists){
val dialog = CollectionExistsDialogFragment.newInstance()
dialog.show(fragmentManager, DIALOG_COLLECTION_EXISTS)
return
} else{
addNewCollectionToFirebase(colName)
}
}
}, colName)
}
}