Я новичок в Dart и Flutter и пытаюсь создать простое приложение, используя Flutter и Firebase (таким образом, Firestore в качестве базы данных).
Вот что я пытаюсь достичь:
- Я хочу, чтобы учащийся мог выбрать школу
- Когда выбран этот параметр, я обновляю школу учащегося, чтобы она являлась ссылкой на documentID школы (некоторые автоматически генерируемые UID поFirestore).Пример: школа: "eGGDjg2JKFWiLfgvHpeE".У меня также есть адрес электронной почты и номер телефона, прикрепленный к учащемуся.
- Вот и все.
Дело в том, что ценность школы постоянно обновляется сама на Firestore.На данный момент у меня есть 2 школы, и он переключается между этими двумя значениями (+ он использует множество действий по написанию бесплатных уровней Firebase).
И последнее, но не менее важное: этот алгоритм находится на странице «Выберите свою школу», но если я перезагружаю приложение, оно автоматически запускает функцию changeSchool (см. ниже) при переходе на эту страницу (БЕЗ касания ListTile!), но не в первый раз, когда я запускаю приложение после удаления-переустановки .. (Дайте мне знать, если неясно, я был там часами).
Future<void> changeSchool(school) async {
CollectionReference schoolCollection =
Firestore.instance.collection('School');
CollectionReference studentCollection =
Firestore.instance.collection('Student');
schoolCollection
.where('name', isEqualTo: school.name)
.where('city', isEqualTo: school.city)
.where('country', isEqualTo: school.country)
.snapshots()
.listen((data) {
if (data.documents.length == 1) {
studentCollection
.where('email', isEqualTo: globals.currentUser.email)
.snapshots()
.listen((students) async {
final DocumentReference studentRef =
studentCollection.document(students.documents[0].documentID);
final DocumentReference ref =
schoolCollection.document(data.documents[0].documentID);
globals.currentSchool = School.fromSnapshot(await ref.get());
Student tmpStudent = Student.fromSnapshot(await studentRef.get());
tmpStudent.school = ref.documentID;
Firestore.instance.runTransaction((transaction) async {
await transaction.update(studentRef, tmpStudent.toJson());
});
});
}
});
Вот что должно вызывать эту функцию:
child: ListTile(
title: Text(school.name),
trailing: Text(school.studentsNumber),
onTap: () async {
await changeSchool(school);
Navigator.pop(context);
},
),
Поскольку я новичок, если естьлучший способ сделать это, я тоже очень открыт!
Спасибо!