Добавление полей вложенной коллекции firestore в список

#flutter #google-cloud-firestore

# #трепетание #google-облако-firestore

Вопрос:

я пытаюсь добавить поля вложенной коллекции в список отзывов. Могу ли я узнать, как мне это сделать в части // Добавить в список //?

Коллекция «Отзывы» содержит 2 вложенных раздела, а именно «1» и «2». Оба ‘1’ и ‘2’ содержат карту из 4 полей.

Ниже приведены коды и скриншот firestore:

 List<dynamic> reviewsList = [];
  Future _getReviews() async{
    firestore.collection('shops').doc(widget.shop.id).collection('reviews').get()
        .then((reviews){
          reviews.docs.forEach((result) {
            firestore.collection('shops').doc(widget.shop.id).collection('reviews').doc(result.id)
                .get().then((reviewDocumentSnapshot) {
               // To add to List //
            });
          });
    });
  }
 

Вложенная коллекция Firestore

Комментарии:

1. сначала вы должны попробовать себя.

2. да, я пробовал, но, похоже, я не могу добавить его в список. Я могу только распечатать детали

Ответ №1:

проблема связана с неправильным пониманием асинхронности. измените свою функцию как

 Future _getReviews() async{
      var reviews = await firestore.collection('shops').doc(widget.shop.id).collection('reviews').get();
   
      reviews.docs.forEach((result) {
        var reviewDocumentSnapshot= await firestore.collection('shops').doc(widget.shop.id).collection('reviews').doc(result.id);
         //add this snapshot to list.  
         reviewsList[your_object.fromJson(reviewDocumentSnapshot)]; 
      });
}
 

и ваш модельный класс будет

  class your_model {
  String name;
  String review;
  int star;
  String uid;

  your_model({this.name, this.review, this.star, this.uid});

  your_model.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    review = json['review'];
    star = json['star'];
    uid = json['uid'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    data['review'] = this.review;
    data['star'] = this.star;
    data['uid'] = this.uid;
    return data;
  }
}