在Flutter Firestore中等待Future <documentsnapshot>的结果

时间:2018-08-18 16:24:00

标签: firebase dart flutter google-cloud-firestore

我有一个包含2个字段的Cloud FireStore数据库。

  • imageUrl(远程文件的网址)
  • 用户(用户集合中文档的参考字段)

下面是我如何从图像集中获取文档的方法。

    class ImagePost {

      final String imageUrl;

      final User user;

      const ImagePost(
          {this.imageUrl,
          this.user});

      factory ImagePost.fromDocument(DocumentSnapshot document) {
        User userInfo;

        DocumentReference userReference = document['user'];
        Future<DocumentSnapshot> userRef = userReference.get();

       userRef.then((document) {
          userInfo = User.fromJSON(document.data);
        });

        ImagePost post = new ImagePost(
          imageUrl: document['imageUrl'],
          user: userInfo // ==> always null while returning
        );

        return post;
      }
    }

获取参考用户文档时,post对象始终包含用户字段的空值。我希望填充用户对象。

但是用户值检索得较晚,并且不会与post对象一起返回。

在返回帖子值之前,如何确保检索到用户值?

1 个答案:

答案 0 :(得分:1)

这是因为get()方法返回一个Future,并且您需要使用async'await'来等待响应,但是无法在您的constructor中使用它

只需创建一个方法(而不是构造函数)并像这样使用:

  Future<ImagePost> getImagePostFromDocument(DocumentSnapshot document) async {
    DocumentReference userReference = document['user'];
    DocumentSnapshot userRef = await userReference.get();
    User userInfo = User.fromJSON(userRef);
    ImagePost post = new ImagePost(
        imageUrl: document['imageUrl'],
        user: userInfo 
        );
    return post;
  }

我建议您将其称为FutureBuilder