#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:
Я бы рекомендовал поместить всех пользователей в коллекцию «Пользователи».
После этого вы можете получить список пользователей из этой коллекции «пользователи» в свой список с помощью:
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.