Flutter:从Firebase中的两个集合中获取数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter:从Firebase中的两个集合中获取数据相关的知识,希望对你有一定的参考价值。

我正在尝试显示具有Firebase集合中发生的事件的ListView,其中包含对另一个集合的引用,但是我无法获取它来完整返回信息。有没有办法引用第二个集合并返回完整数据?

PlacesEvents

我已经尝试过这种方式,但是没有用

class Event {
  String id;
  Timestamp date;
  String description;
  String name;
  String place;
  Place placeData;

  Event(this.id, this.date, this.description, this.name, this.place);
  Event.withPlace(this.id, this.date, this.description, this.name, this.place, this.placeData);

  Event.fromFirestore(DocumentSnapshot doc)
      : id= doc.documentID,
        date = doc.data['date'] ?? '',
        description = doc.data['description'] ?? '',
        name = doc.data['name'] ?? '',
        place = doc.data['place'] ?? '';
}

Stream<List<Event>> getFutureEventsFromFirestore() {
  return Firestore.instance.collection('events').orderBy('date', descending: false).snapshots().map(futureEventListWithPlace);
}

List<Event> futureEventList(QuerySnapshot query) {
  return query.documents.where((event) => event['date'].toDate().isAfter(DateTime.now())).map((event) => Event.fromFirestore(event)).toList();
}

List<Event> futureEventListWithPlace(QuerySnapshot query) {
  return query.documents.where((event) => event['date'].toDate().isAfter(DateTime.now())).map((event) {
    final Event eventF = Event.fromFirestore(event);
    FirebaseProvider.getPlaceFromFirestore(eventF).then((value){
      Event.withPlace(eventF.id, eventF.date, eventF.description, eventF.name, eventF.place, value);
    });
  }).toList();
}

Future<Place> getPlaceFromFirestore(Event event) async {
  DocumentReference documentReference = Firestore.instance.collection("places").document(event.place);
  await documentReference.get().then((DocumentSnapshot ds) {
    return Place.fromMap(ds.data);
  });
}

List<Event> pastEventList(QuerySnapshot query) {
  return query.documents.where((event) => event['date'].toDate().isBefore(DateTime.now())).map((event) => Event.fromFirestore(event)).toList();
}
答案
该字段的正确值应该是完整的文档路径。

您的情况是:

places/socialClub

然后您应该能够从事件对象访问位置快照,如下所示:

data['place'].get();

有关详细信息:https://firebase.google.com/docs/reference/js/firebase.database.Reference

另一答案
尽管您可以Collection group queries从子集合中获取数据。

一些用于了解集合组查询以及如何定义架构的资源

Understanding collection group queries

    Maps, Arrays and Subcollections

以上是关于Flutter:从Firebase中的两个集合中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

从登录用户 Flutter/Firebase 获取文档列表

Flutter Firebase - 从文档中获取特定字段

如何使用 Flutter 从 Firebase 获取当前活跃用户?

Flutter - 使用 firebase 集合填充列表

在地图上显示 firebase 子集合的引脚 - Flutter

Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)