es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener datos de Firebase Firestore y almacenarlos en una lista para usar en los Widgets de Flutter?

Estoy trabajando en una aplicación en la que necesito almacenar y leer datos de Firestore. Actualmente estoy utilizando una lista de mapas para generar widgets. Mi lista es:

List<map> subjects = [
  {"name": "WAK", "time": 13.30, "day": 'Mon'},
  {"name": "RAD", "time": 10.30, "day": 'Tue'},
  {"name": "PQR", "time": 15.15, "day": 'Fri'}
];

A partir de la lista anterior, estoy generando widgets que la aplicación mostrará utilizando un widget de columna. Mi pantalla de Flutter se muestra aquí:

Imagen

Ahora, quiero lograr lo mismo, pero en lugar de una lista predefinida, quiero recuperar datos de Firestore. Para esto, he escrito el siguiente código:

FirebaseFirestore.instance
    .collection('classes')
    .get()
    .then((QuerySnapshot querySnapshot) {
  querySnapshot.docs.forEach((doc) {
    print(doc.data());
  });
});

A partir del código anterior, obtengo la siguiente salida en la terminal:

I/flutter ( 5012): {subject: SE, fromTime: 1115, days: [Mon, Wed]}
I/flutter ( 5012): {subject: OSSS, fromTime: 1430, days: [Tue, Wed, Fri]}

Como puedes ver, la estructura de cada documento es casi igual que la del mapa que definí anteriormente, pero no pude descubrir cómo tomar los datos de esto y almacenarlos en una lista de mapas para poder generar los widgets de la misma manera que antes.
Además, ¿hay alguna forma mejor o más eficiente de recuperar datos de Firestore y utilizarlos en mis widgets?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para almacenar los datos obtenidos de Firestore en una lista de mapas, puedes crear una lista vacía y luego recorrer los documentos devueltos por Firestore y agregar los datos de cada documento a la lista como un nuevo mapa.

    Aquí tienes un ejemplo:

    List<><string, dynamic="">> subjects = [];
    
    FirebaseFirestore.instance
      .collection('classes')
      .get()
      .then((QuerySnapshot querySnapshot) {
        querySnapshot.docs.forEach((doc) {
          // Agregar los datos de este documento a la lista subjects
          subjects.add({
            "name": doc.data()["subject"],
            "time": doc.data()["fromTime"],
            "day": doc.data()["days"][0], // asumiendo que se almacena solo un día, utilizando el índice 0
          });
        });
      });
    

    En este ejemplo, creamos una lista vacía llamada subjects. Cuando obtenemos los datos de Firestore, recorremos cada documento devuelto y agregamos sus datos a la lista subjects como un nuevo mapa. Accedemos a los datos utilizando el método doc.data(), y luego usamos los datos para crear un nuevo mapa con la misma estructura que los mapas de nuestra lista original.

    Suponemos que en los datos de Firestore, el nombre de la asignatura se almacena bajo la clave “subject”, el tiempo se almacena bajo la clave “fromTime” y el día se almacena como un array bajo la clave “days”.

    Una vez que tenemos nuestra lista de mapas, podemos usarla para generar widgets de la misma manera que antes:

    Column(
      children: subjects.map((subject) => 
        ListTile(
          title: Text(subject["name"]),
          subtitle: Text("${subject["day"]} ${subject["time"]}"),
        )
      ).toList(),
    )
    

    En cuanto a la eficiencia, obtener datos de Firestore utilizando el método get() es un enfoque adecuado para conjuntos de datos pequeños a medianos. Sin embargo, para conjuntos de datos más grandes, puede ser más eficiente utilizar un Stream para escuchar los cambios en los datos en tiempo real, en lugar de obtener todos los datos de una vez. Puedes obtener más información sobre Streams y Firestore en la documentación de Flutter.</string,>

Comments are closed.