есть ли способ написать список моделей в подколлекции Firebase - PullRequest
0 голосов
/ 28 мая 2020

У меня есть модель, содержащая список другой модели в качестве атрибута, который я собираю динамически из формы, заполняемой пользователем. код для первой модели:

class Attraction {
  String atName;
  String atDiscreption;
  double latitude;
  double longitude;
  GeoPoint geoPoint;
  String atImageUrl;

  List<Timeline> timlines;

  Attraction(
      {
      this.atName,
      this.atDiscreption,
      this.geoPoint,
      this.latitude,
      this.longitude,
      this.atImageUrl,
      this.timlines});
} 

код для второй модели:

class Timeline {
  int date;
  String descreption;

  Timeline(this.date, this.descreption);
}

Я просто пишу первую модель в firebase firestore, используя этот метод:

final CollectionReference attractions =
      Firestore.instance.collection('attractions');

  Future updateAttractionData(Attraction attraction) async {
    return await attractions.document().setData({
      'atName': attraction.atName,
      'atDiscreption': attraction.atDiscreption,
      'atImageUrl': attraction.atImageUrl,
      'location': attraction.geoPoint,
    });
  }

и я хочу записать список временных шкал в Firebase в виде подколлекции. Возможно ли это? Я попробовал этот метод, но он не сработал:

Future updateTimelinesData(Attraction attraction) async {
    return attraction.timlines.map((e) =>
        attractions.document().collection('timelines').document().setData({
          'date': e.date,
          'discreption': e.descreption,
        }));
  }

PS: я могу передать данные непосредственно в виде поля карты в документы, как показано в этом коде:

final CollectionReference attractions =
      Firestore.instance.collection('attractions');

  Future updateAttractionData(Attraction attraction) async {
    List<Map> convertTimlinesToMap({List<Timeline> timlines}) {
      List<Map> timelines = [];
      timlines.forEach((Timeline timeline) {
        Map time = timeline.toMap();
        timelines.add(time);
      });
      return timelines;
    }

    return await attractions.document().setData({
      'atName': attraction.atName,
      'atDiscreption': attraction.atDiscreption,
      'atImageUrl': attraction.atImageUrl,
      'location': attraction.geoPoint,
      //we used a method here because Firebase does not writes list of objects , but it can do map attributes 
      //so we're converting the list of timeline objects to list of maps
      'timeline': convertTimlinesToMap(timlines: attraction.timlines),
    });
  }

но я ищу, чтобы передать его как вложенную коллекцию, а не как поле.

...