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

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

  • imageUrl(远程文件的url)

  • user(用户集合中文档的引用字段)

以下是我从图像集中获取文档的方法 .

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对象一起返回 .

如何在返回post值之前确保检索用户值?

回答(1)

3 years ago

那是因为 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