Как «ждать» неперспективную переменную? - PullRequest
0 голосов
/ 28 марта 2019

У меня DocumentReference locationDocumentRef; в моем состоянии.

Я меняю locationDocumentRef на основе ссылок, собираю ли я по запросу или добавляя новый документ.

Так что у меня есть эта функция для проверки документов, если есть одна, установите ее ссылку на locationDocumentRef, или добавьте новую и установите ее ссылку на locationDocumentRef. Я сбрасываю его значение каждый раз, устанавливая его в ноль, так как я не хотел получать предыдущий результат. Но он печатает ноль.

Итак, мой вопрос, как я могу решить их и получить значение? Я думаю, что я решаю слишком рано в своем коде, поэтому я не могу ожидать не будущее значение. Как я могу это исправить?

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

Ответы [ 3 ]

1 голос
/ 29 марта 2019

есть две ошибки, которые я увидел здесь впервые var resolvedRef = await locationDocumentRef; почему вы ждете для locationDocumentRef, во-вторых, вы не ждете pushNameToFirestore (PlaceDetails pd) firestoreCheckAndPush (), что странно, поскольку pushNameToFirestore (String) синхронизируется, и это означает, что вы не дождетесь его завершения, поэтому, если вы добавляете новое имя, оно будет печатать ноль. поправь меня если я не прав. Вы можете узнать больше о синхронизации и будущем здесь https://www.dartlang.org/tutorials/language/futures посмотрите на график в середине страницы

0 голосов
/ 29 марта 2019

Посмотрите на следующий код.

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');
    }
  }
0 голосов
/ 28 марта 2019

Попробуйте это

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');
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...