J'ai trouvé de nombreuses solutions pour récupérer des données de Firebase vers Widget ou avec l'utilisation de méthodes asynchrones, bien que je ne puisse pas l'utiliser pour mon cas. Je veux utiliser flutter_week_view à partir de https://pub.dev/packages/flutter_week_view et afin de transmettre des événements de la base de données, je dois les remplir pour List<FlutterWeekViewEvent> events
. J'ai essayé l'approche avec StreamBuilder
, mais cela crée un widget ListView
et ce n'est pas ce que j'ai l'intention de faire:
Future<List<FlutterWeekViewEvent>> retriveRecords() async { List<FlutterWeekViewEvent> events = []; DateTime now = DateTime.now(); QuerySnapshot querySnapshot = await FirebaseFirestore.instance.collection("Test").get(); for (int i = 0; i < querySnapshot.docs.length; i++) { var a = querySnapshot.docs[i]; DateTime start = DateTime(now.year, now.month, now.day, now.hour - 7); events.add(FlutterWeekViewEvent( title: a.get('name'), start: start, end: start.add(const Duration(hours: 2)), backgroundColor: Colors.red, description: 'bla bla', )); } return events; }
J'avais également essayé une autre approche:
StreamBuilder( stream: FirebaseFirestore.instance.collection('Test').snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) return const Text('Loading..'); return ListView.builder( itemExtent: 80.0, itemCount: snapshot.data.documents.length, itemBuilder: (context, index) => Text(snapshot .data.documents[index] .get('name') .toString())); })
Mais dans ce cas, mon problème est que je voulais remplir la liste d'événements dans la méthode build () et cela ne fonctionne pas, car retriveRecords est une méthode anync.
Toute aide appréciée! Je suis débutant à Flutter.
3 Réponses :
Essayez de remplacer From: a.get (nom); À: a.data [nom]
Ok, mais ce n'est pas une réponse à ma question, cela fonctionne de la manière dont j'ai posté dans ma question, l'application récupère les données de Firebase, mais mon problème est de mettre ces données dans List <Object>
Vous pouvez appeler votre fonction async
retriveRecords()
dans FutureBuilder
. Il attendra la fin:
FutureBuilder<List<FlutterWeekViewEvent>>( future: retriveRecords(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { List<FlutterWeekViewEvent> weekEvents = snapshot.data; return DayView( date: DateTime.now(), events: weekEvents, ); } return const Text('Loading..'); }, )
Laisse moi savoir si ça fonctionne...
StreamBuilder( stream: FirebaseFirestore.instance.collection('Test').snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return const Text("Loading"); } else if (snapshot.hasData && snapshot.connectionState == ConnectionState.active) { List<QueryDocumentSnapshot> documentSnapshot = snapshot.data.documents; List<FlutterWeekViewEvent> events = []; for(QueryDocumentSnapshot doc in queryDocumentSnapshot) { DateTime start = DateTime(now.year, now.month, now.day, now.hour - 7); final flutterWeekViewEvent = FlutterWeekViewEvent( title: doc.data()["name"], start: start, end: start.add(const Duration(hours: 2)), backgroundColor: Colors.red, description: "bla bla", ); events.add(flutterWeekViewEvent); } } return ListView.builder( itemExtent: 80.0, itemCount: event.length, itemBuilder: (context, index) { /// I got this part from the package return DayView ( date: now, event: events, ); } ); });
remplacez
snapshot.data.documents[index].get('name').toString())
parsnapshot.data.documents[index].data()['name'].toString())
Ok, mais ce n'est pas une réponse à ma question, cela fonctionne de la manière dont j'ai posté dans ma question, l'application récupère les données de Firebase, mais mon problème est de mettre ces données dans List <Object>
Préférez-vous une solution StreamBuilder?