I cannot figure it out how to retrieve a nested collection in CloudFirestore and use the nested collection to create the childrens of a ExpansionTile.
I want to show within the `ExpansionTile` , the project `name` as title, and childrens all the surveys using their name in the ListTile.
class SurveysItems {
final String surveyName;
final String surveyKey;
const SurveysItems({this.surveyName, this.surveyKey});
factory SurveysItems.fromDocument(DocumentSnapshot document) {
return SurveysItems(
surveyName: document['surveyName'], surveyKey: document.documentID);
}
}
class ProjectItem {
final String name;
final String projectKey;
const ProjectItem({this.name, this.projectKey});
factory ProjectItem.fromDocument(DocumentSnapshot document) {
return ProjectItem(
name: document['name'],
projectKey: document.documentID,
);
}
}
class StationItems {
final String name;
final String stationKey;
const StationItems({this.name, this.stationKey});
factory StationItems.fromDocument(DocumentSnapshot document) {
return StationItems(
name: document['name'], stationKey: document.documentID);
}
}
class ProjectList extends StatelessWidget {
ProjectList({this.firestore});
final Firestore firestore;
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: firestore.collection('projects').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return const Text('Loading...');
final int projectsCount = snapshot.data.documents.length;
return new ListView.builder(
itemCount: projectsCount,
itemBuilder: (_, int index) {
final DocumentSnapshot document = snapshot.data.documents[index];
//final CollectionReference surveysCollection = document.reference.collection('surveys');
final ProjectItem projectItem = ProjectItem.fromDocument(document);
Future<List<SurveysItems>> surveyItems = document.reference.collection('surveys').getDocuments()
.then((docs){
return docs.documents.map(
(d){ SurveysItems.fromDocument(d); }).toList();
});
return ExpansionTile(
title: Text(projectItem.name), // the following line does not work as the method map does not exist for the Future.
children: surveyItems.map((SurveysItems item){ return ListTile(title: Text(item.surveyName),); }).toList());
},
);
},
);
}
}