![](/img/trans.png)
[英]Problem with asynchronous behaviour in flutter and firebase combination
[英]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.