0
votes

Récupérer les données de Firebase Firestore vers la liste <Object>

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 commentaires

remplacez snapshot.data.documents[index].get('name').toString()) par snapshot.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?


3 Réponses :


0
votes

Essayez de remplacer From: a.get (nom); À: a.data [nom]


1 commentaires

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>



1
votes

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..');
          },
        )


0 commentaires

0
votes

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,
          );

        }
      );
  });


0 commentaires