首页 > 解决方案 > Flutter:从 Firebase 中的两个集合中获取数据

问题描述

我正在尝试显示一个 ListView,其中包含我在 firebase 集合中拥有的事件,并且其中引用了另一个集合,但我无法让它完整地返回信息。有没有办法引用第二个集合并返回完整数据?

地方 活动

我试过这样做,但它不起作用

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();
}

标签: firebasefluttergoogle-cloud-firestore

解决方案


看起来您没有为“事件”文档中的位置字段使用“参考”类型的字段。因此,请确保此字段设置为“引用”并且它包含有效值。

该字段的正确值应该是完整的文档路径。

在您的情况下,这将是:

places/socialClub

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

data['place'].get();

欲了解更多信息:https ://firebase.google.com/docs/reference/js/firebase.database.Reference


推荐阅读