如何“等待”非未来变量?

时间:2019-03-28 12:39:43

标签: dart flutter async-await google-cloud-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;
      });
    }

3 个答案:

答案 0 :(得分:1)

我首先在这里看到两个错误  var resolveRef =等待locationDocumentRef; 为什么要等待locationDocumentRef, 第二,您不用等待pushNameToFirestore(PlaceDetails pd)firestoreCheckAndPush()函数,因为pushNameToFirestore(String)是同步的,所以这很奇怪,这意味着您不会等待它完成,因此如果添加新名称,它将打印为null。 如果我错了,请纠正我。 您可以在https://www.dartlang.org/tutorials/language/futures上找到有关同步和未来的更多信息 look at the graph at the middle of the page

答案 1 :(得分:-1)

尝试一下

<div>
 <span>Test One</span>
 <span>Test Two</span>
 <span>Test Three</span>
</div>

答案 2 :(得分:-1)

看看下面的代码。

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