#dart #flutter #async-await #google-cloud-firestore
#dart #флаттер #async-ожидание #google-облако-firestore
Вопрос:
У меня есть DocumentReference locationDocumentRef;
в моем состоянии.
Я изменяю locationDocumentRef
на основе ссылок, собираю ли я путем запроса или путем добавления нового документа.
Итак, у меня есть эта функция для проверки документов, если есть один, установите его ссылку на locationDocumentRef
, или добавьте новый и установите его ссылку на locationDocumentRef
. Я каждый раз сбрасываю ее значение, устанавливая для него значение null, поскольку я не хотел получать предыдущий результат. Но она выводит значение null.
Итак, мой вопрос в том, как я могу разрешить их и получить значение? Я думаю, что я разрешаю слишком рано в своем коде, поэтому я не могу ожидать значение, не относящееся к будущему. Как я могу это исправить?
void firestoreCheckAndPush() async {
setState(() {
locationDocumentRef = null;
});
bool nameExists = await doesNameAlreadyExist(placeDetail.name);
if (nameExists) {
print('name exist');
} else {
print('name will be pushed on firestore');
pushNameToFirestore(placeDetail);
}
var resolvedRef = await locationDocumentRef;
print(resolvedRef.documentID); // I get null here
}
Это функции, которые я использовал
Future<bool> doesNameAlreadyExist(String name) async {
QuerySnapshot queryDb = await Firestore.instance
.collection('locations')
.where("city", isEqualTo: '${name}')
.limit(1)
.getDocuments();
if (queryDb.documents.length == 1) {
setState(() {
locationDocumentRef = queryDb.documents[0].reference;
});
return true;
} else {
return false;
}
}
И другой
void pushNameToFirestore(PlaceDetails pd) async {
DocumentReference justAddedRef =
await Firestore.instance.collection('locations').add(<String, String>{
'city': '${pd.name}',
'image': '${buildPhotoURL(pd.photos[0].photoReference)}',
});
setState(() {
locationDocumentRef = justAddedRef;
});
}
Ответ №1:
есть две ошибки, которые я увидел, во-первых, здесь var resolvedRef = await locationDocumentRef; почему вы ожидаете locationDocumentRef, во-вторых, вы не ждете функции pushNameToFirestore (PlaceDetails pd) firestorecheck и Push (), что странно, поскольку pushNameToFirestore (строка) синхронизирована, и это означает, что вы не стали бы ждать ее завершения, поэтому, если вы добавляете новое имя, оно будет печатать null. поправьте меня, если я ошибаюсь. вы можете найти больше о синхронизации и будущем здесьhttps://www.dartlang.org/tutorials/language/futures
посмотрите на график в середине страницы
Комментарии:
1. ожидание завершения работы pushNameToFirestore (PlaceDetails pd) решило мою проблему, спасибо!
Ответ №2:
Попробуйте это
Future<List<DocumentSnapshot>> doesNameAlreadyExist(String name) async {
QuerySnapshot data = await Firestore.instance
.collection('locations')
.where("city", isEqualTo: name)
.limit(1)
.getDocuments();
return data.documents;
}
void firestoreCheckAndPush() async {
var data = await doesNameAlreadyExist('yourname');
if (data.length > 0) {
print('name exist');;
print('Document id ' data[0].documentID);
} else {
print('name will be pushed on firestore');
}
}
Комментарии:
1. Как мне получить documentId из pushNameToFirestore? Мне нужно сохранить ссылки в обоих случаях, если данные существуют, получить существующую ссылку или данные не существуют, добавить новую и вернуть только что добавленную ссылку на данные.
Ответ №3:
Взгляните на следующий код.
void firestoreCheckAndPush() async {
DocumentReference documentReference;
var data = await doesNameAlreadyExist('yourname');
var dataRef = await doesNameAlreadyExist('yourname');
if (data.length > 0) {
print('name exist');
documentReference = dataRef[0].reference;
print('Document id ' data[0].documentID);
documentReference = dataRef[0].reference;
print('Document reference ');
print(documentReference);
} else {
print('name will be pushed on firestore');
}
}