Я пытаюсь получать обновления в реальном времени с Cloud Firestore. Несмотря на то, что чтение и запись выполнены успешно, я не могу получить уведомление об обновлении со следующим кодом в Kotlin:
val collectionName = "users"
val docId = "alovelace"
val docRef = db.collection(collectionName).document(docId)
docRef.addSnapshotListener({ doc, e ->
System.out.println("Updated")
if (doc != null) {
if (doc.exists()) {
System.out.println("Current data: " + doc.getData())
}
else {
System.out.println("Current data: null")
}
}
else {
e!!.printStackTrace()
}
})
Я могу прочитать из docRef , и, следовательно, это действительная ссылка на документ:
System.out.println("Get " + docRef.get().get().getData())
//print Get {last=Lovelace, born=1915, first=Bob}
Я также следовал другому примеру кода, чтобы обернуть его как функцию и вернуть при наличии одного снимка, но все еще напрасно
fun listenToDocument(
db: Firestore,
collection: String,
document: String
): Map<String, Any>{
val future = SettableApiFuture.create<Map<String, Any>>();
// [START listen_to_document]
val docRef = db.collection(collection).document(document)
docRef.addSnapshotListener(object: EventListener<DocumentSnapshot> {
override fun onEvent(
snapshot: DocumentSnapshot?,
e: FirestoreException?
) {
if (e != null) {
System.err.println("Listen failed: " + e);
return;
}
if (snapshot != null && snapshot.exists()) {
System.out.println("Current data: " + snapshot.getData());
} else {
System.out.print("Current data: null");
}
// [START_EXCLUDE silent]
if (!future.isDone()) {
future.set(snapshot!!.getData());
}
// [END_EXCLUDE]
}
});
// [END listen_to_document]
return future.get(TIMEOUT_SECONDS, TimeUnit.SECONDS)
}
Thread( fun() {
val update = listenToDocument(db, collectionName, docId)
System.out.println(update)
}).start()
Я обновил поля документа из Интернетаинтерфейс, а также следующий код:
val writeDocRef = db.collection(collectionName).document(docId)
// Add document data with id "alovelace" using a hashmap
val data = HashMap<String, Any>()
data.put("first", "Ada")
data.put("last", "Lovelace")
data.put("born", 1815)
//asynchronously write data
val result = writeDocRef.set(data)
// result.get() blocks on response
System.out.println("Update time : " + result.get().getUpdateTime())
Запись также выполнена успешно, но я просто не вижу никаких выходных данных из функции onEvent, то есть она никогда не вызывается. Я просмотрел несколько других примеров, в том числе официальные руководства , но все они похожи. И я не видел, чтобы кто-нибудь жаловался на это ... пожалуйста, помогите.