о чтении файлов firestore в flutter с циклом for

#firebase #flutter #google-cloud-firestore

# #firebase #flutter #google-облако-firestore

Вопрос:

Я хочу создать таблицу данных, прочитав файлы в firestore в виде списка.Для этого я сначала нарисовал список с идентификаторами пользователей из firestore следующим образом. Затем я попытался извлечь данные каждого пользователя, создав цикл for из этого списка. Следующие коды выдают ошибку. Я совершаю логическую ошибку? Я был бы очень рад, если бы вы могли помочь с решением моей проблемы.

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:okul/ogrencilistesi.dart';

class GenSonuc1 extends StatefulWidget {
  @override
  _GenSonuc1 createState() => new _GenSonuc1();
}

class _GenSonuc1 extends State<GenSonuc1> {
  void initState() {
    getUser();
    super.initState();
  }
  List <ogrenciListesi> sonuclar = [];
  List userList=[];
  bool sort = false;
  String iD;
  String gelenisim='', gelensube='';
  int gelenturkce = 0, gelenmat = 0, gelenfen = 0, gelensos = 0, gelendin = 0, gelening = 0;
  double gelenpuann=0.0;

  FirebaseFirestore _firestore = FirebaseFirestore.instance;
  DocumentSnapshot gelenSinif, gelenPuan, gelenSoz, gelenSay;

  Future<void> getUser() async {
   return await FirebaseFirestore.instance.collection('SekizSozel1').get().then((
        QuerySnapshot querySnapshot) async {
      if (querySnapshot != null) {
        for (DocumentSnapshot user in querySnapshot.docs) {
          iD = user.id;
          userList.add(iD);
        }
        getData();

      } else {
        return null;
      }
     // print(userList.toString());

   });


  }

  Future <void> getData()async{

     for (String user in userList) {
      gelenSinif= await _firestore.collection("sinif").doc(user).get();
      gelenisim = gelenSinif.get("isim");gelensube = gelenSinif.get("sube");

      gelenPuan=await _firestore.collection('puanlar').doc(user).get();
      gelenpuann = gelenPuan.get("puan1");

      gelenSoz=await _firestore.collection('SekizSozel1').doc(user).get();
      gelenturkce=gelenSoz.get('turkceBssari'); gelensos = gelenSoz.get("sosyalBasari");
      gelendin = gelenSoz.get("dinBasari");gelening = gelenSoz.get("ingilizceBasari");

      gelenSay =await _firestore.collection('SekizSayisal1').doc(user).get();
      gelenmat = gelenSay.get("matematikBasari");gelenfen = gelenSay.get("fenBasari");

      /*await FirebaseFirestore.instance.collection('sinif').doc(user).get().then((DocumentSnapshot gelenSinif) {
        if (gelenSinif != null) {setState(() {});}});
      await FirebaseFirestore.instance.collection('puanlar').doc(user).get().then((DocumentSnapshot gelenPuan) {
        if (gelenPuan !=null) {setState(() {});}});
      await FirebaseFirestore.instance.collection('SekizSozel1').doc(user).get().then((DocumentSnapshot gelenSoz) {
        if (gelenSoz != null) {setState(() {});}});
      await FirebaseFirestore.instance.collection('SekizSayisal1').doc(user).get().then((DocumentSnapshot gelenSay) {
        if (gelenSay !=null) {setState(() {});}});*/

      sonuclar.add(ogrenciListesi(gelenisim, gelensube, gelenpuann, gelenturkce, gelenmat, gelenfen, gelensos, gelendin, gelening));
      print(user);

    }
     }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: Container(
            child: SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child: SingleChildScrollView(
                  scrollDirection: Axis.horizontal,
                  child: DataTable(
                    sortColumnIndex: 1,
                    sortAscending: true,
                    columns: <DataColumn>[
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.userName.compareTo(a.userName));
                            } else {
                              sonuclar.sort((a, b) => a.userName.compareTo(b.userName));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('AD - SOYAD',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.10,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.sube.compareTo(a.sube));
                            } else {
                              sonuclar.sort((a, b) => a.sube.compareTo(b.sube));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('SINIF',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.puann.compareTo(a.puann));
                            } else {
                              sonuclar.sort((a, b) => a.puann.compareTo(b.puann));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('PUAN',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.turkce.compareTo(a.turkce));
                            } else {
                              sonuclar.sort((a, b) => a.turkce.compareTo(b.turkce));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('TUR.',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.mat.compareTo(a.mat));
                            } else {
                              sonuclar.sort((a, b) => a.mat.compareTo(b.mat));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('MAT.',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.fen.compareTo(a.fen));
                            } else {
                              sonuclar.sort((a, b) => a.fen.compareTo(b.fen));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('FEN B.',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.sos.compareTo(a.sos));
                            } else {
                              sonuclar.sort((a, b) => a.sos.compareTo(b.sos));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('SOS. B.',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.din.compareTo(a.din));
                            } else {
                              sonuclar.sort((a, b) => a.din.compareTo(b.din));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('DİN K.',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                      DataColumn(
                          numeric: false,
                          onSort: (int index, bool ascending) {
                            if (ascending) {
                              sonuclar.sort((a, b) => b.ing.compareTo(a.ing));
                            } else {
                              sonuclar.sort((a, b) => a.ing.compareTo(b.ing));
                            }
                            setState(() {
                              sort = ascending;
                            });
                          },
                          label: Container(
                            child: FittedBox(fit: BoxFit.fitWidth,
                              child: Text('İNG.',
                                  style: TextStyle(fontWeight: FontWeight
                                      .bold)),),
                            width: MediaQuery
                                .of(context)
                                .size
                                .width * 0.03,
                            height: 56,
                            padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
                            alignment: Alignment.centerLeft,
                          )
                      ),
                    ],
                    rows: mapItemToDataRows(sonuclar).toList(),
                  ),
                )
            )
        )
    );
  }

  Iterable<DataRow> mapItemToDataRows(List<ogrenciListesi> sonuclar) {
    Iterable<DataRow> dataRows = sonuclar.map((item) {
      return DataRow(
          cells: [
            DataCell(Text(item.userName),),
            DataCell(Text(item.sube,),),
            DataCell(Text(item.sube,),),
            DataCell(Text(item.puann.toString(),),),
            DataCell(Text(item.turkce.toString(),),),
            DataCell(Text(item.mat.toString(),),),
            DataCell(Text(item.fen.toString(),),),
            DataCell(Text(item.sos.toString(),),),
            DataCell(Text(item.din.toString(),),),
            DataCell(Text(item.ing.toString(),),),
          ]);
    });
    return dataRows;
  }
}
 

Комментарии:

1. Я рекомендую это и это , прежде чем идти дальше.

Ответ №1:

Я бы рекомендовал поместить всех пользователей в коллекцию «Пользователи».

После этого вы можете получить список пользователей из этой коллекции «пользователи» в свой список с помощью:

 List userList = [];

  Future <void> getUsers() {
    firestore.collection('users').get()
        .then((snapshot) {
       setState(() {
         userList = snapshot.docs;
       });
    });
  }
 

Затем вы можете использовать get данные внутри каждого из пользовательских документов. Пример:

 void printName(){
    print(userList[0].data()['name']);
    print(userList[1].data()['name']);
  }
 

Комментарии:

1. Основной метод, с которым у меня возникли проблемы, — это getData . Я предполагаю, что есть проблема с циклом for.