Как «ожидать» переменную, не относящуюся к будущему?

#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');
    }
  }