繁体   English   中英

Flutter 异步 firebase 请求未等待

[英]Flutter Asynchronous firebase request not awaited

我正在使用 flutter 开始我的第一个 Firebase 项目,并希望从我的 Firebase CloudFirestore 数据库中检索数据并将其显示在应用程序中。

我用这个 class 从 Firebase 获取数据:

class getFirebaseData
{
  List<ArticleItems> requestedItems = [];

  Future<List<ArticleItems>> getFirebaseArticles()
  {

    //Create new Firebase instance
    final firestoreInstance = FirebaseFirestore.instance;

    //Get data from Firebase
    firestoreInstance.collection("categories/politik/articles").snapshots().listen((data) =>
    //For each found document run loop
      data.docs.forEach((doc) {

        //Convert Firebase timestamp to DateTime
        Timestamp firebaseTimestamp = doc.data()['articlePublishTimestamp'];
        DateTime firebaseDateTime = DateTime.fromMicrosecondsSinceEpoch(firebaseTimestamp.microsecondsSinceEpoch);

        //Create new ArticleItem and insert data from Firebase
        ArticleItems firebaseItem = new ArticleItems(
            article_id: doc.data()['articleId'],
            article_thumbnail_url: doc.data()['articleThumbnailUrl'],
            article_headline: doc.data()['articleHeadline'],
            article_fulltext: doc.data()['articleFulltext'],
            article_author: doc.data()['articleAuthor'],
            article_category: doc.data()['articleCategory'],
            article_publish_timestamp: firebaseDateTime
        );

        //Add created item to list of all requested items
        requestedItems.add(firebaseItem);

        print('Future finished');
      }));

    }
}

在我的主要方法中,我试图等待请求的结果并想要 output 它(尝试只获取长度以检查列表中是否有条目)。 我为此使用了这段代码:

  //Async request to get Firebase Data
  void getArticleInformation() async
  {
    getFirebaseData firebaseData = getFirebaseData();
    await firebaseData.getFirebaseArticles();

    print('Await finished');

    articleItems = firebaseData.requestedItems;
    print("Length FirebaseItems: " + firebaseData.requestedItems.length.toString());
    print("Length ArticleItems: " + articleItems.length.toString());
  }

当我运行应用程序时,返回列表的长度为零(应为 2),控制台 output“等待完成”出现在 output“未来完成”之前。 在我看来,await function 似乎没有等待结果,而是开始执行下一行代码。

如果你能告诉我我在那里做错了什么以及如何解决它,那就太好了。

(我没有测试这段代码。如果有问题或不工作告诉我:)

你可以试试这样的东西,看起来更干净:

class FirebaseRepository {
  Future<List<ArticleItems>> getArticleItems() {
    var instance = Firestore.instance();
    var snapshot = await instance.collection("categories/politik/articles").get();
    return snapshot.docs.map((e)=>ArticleItem.fromSnapshot(e)).toList();
  }

}

在你的 ArticleItem 中是这样的:

class ArticleItem {

  factory ArticleItem.fromSnapshot(QueryDocumentSnapshot snapshot) {
    return ArticleItem(
      article_id: snapshot.get("articleId"),
      article_thumbnail_url: snapshot.get("articleThumbnailUrl"),
      article_headline: snapshot.get("articleHeadline"),
      article_fulltext: snapshot.get("articleFulltext"),
      article_author: snapshot.get("articleAuthor"),
      article_category: snapshot.get("articleCategory"),
      article_publish_timestamp: firebaseDateTime
    );
  }
}

检索这样的项目:

articleItems = await new FirebaseRepository().getArticleItems();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM