简体   繁体   中英

how to access a collection inside a firestore document and assign it as a list to my dart list inside my model?

how can i access a firestore collection inside a document and assign it to a list in my model, i tried accessing it like this snap.reference.collection('submittedUsers').get(); but i can't use async/await in constructors so i didn't knew what to do, this my model code:

  final String fileUrl;
  final String title;
  final String description;
  final List<String> submittedUsers;

  LectureModel({
    @required this.fileUrl,
    @required this.title,
    @required this.description,
    this.submittedUsers,
  }) : super(
          fileUrl: fileUrl,
          title: title,
          description: description,
          submittedUsers: submittedUsers,
        );


  Map<String, dynamic> toDocument() {
    return {
      'fileUrl': fileUrl,
      'title': title,
      'description': description,
    };
  }

  factory LectureModel.fromSnapshot(DocumentSnapshot snap) {   
  // my submittedUsers collection is inside this `snap` document
 // i want to get that collection and i assign it's memebers to my model submittedUsers list


    final data = snap.data();
    
    return LectureModel(
      fileUrl: data['fileUrl'] as String,
      title: data['title'] as String,
      description: data['description'] as String,
    );
  }
}

Your data class looks just fine., but in your current structure, also add a list to your factory in the model, like this:

 factory LectureModel.fromSnapshot(DocumentSnapshot snap, List<String> submittedUsersList) {   
    final data = snap.data();
    
    return LectureModel(
      fileUrl: data['fileUrl'] as String,
      title: data['title'] as String,
      description: data['description'] as String,
      submittedUsers: submittedUsersList,
    );
  }
}

But you need to call your method LectureModel.fromSnapshot inside a function, or a future builder or stream builder for example. And also fetch the subcollection after getting the parent document

For example, you need a function like this, and put it in your widget where you need it.

Future<List<LectureModel>> getLectures() async {
QueryDocumentSnapshot snap = await FirebaseFirestore.instance.collection('NAME_OF_PARENT_COLLECTION').get();
List<LectureModel> lectureList=[];

//this will check that there actually is documents in firebase
if(snap.docs.isNotEmpty){
   for(var singleSnapDocument in snap.docs){
   //then you have to get the subcollection seperately for every 
   //document.
List<String> listOfsubmittedUsers =[];
listOfsubmittedUsers = await 
FirebaseFirestore.instance.collection('NAME_OF_PARENT_COLLECTION')
.doc(singleSnapDocument.id).collection('submittedUsers')
.get().then((result)=> result.docs.map((e) => e.data().toString()).toList());

   //this will add a LectureModel object into our list lectureList
   lectureList.add(LectureModel.fromSnapshot(singleSnap, listOfsubmittedUsers));
   }
 }
print('Length of lectureList is: ' + lectureList.length.toString());
return lectureList;
}

Now, anywhere in your code, you can use onPressed or in initState and just call your function getLectures. ie onPressed: () async {List<LectureModel> listOfLecture = await getLectures();}

Your problem should be solved.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM