Flutter & Firestore - обновление никогда не останавливается (переключение с одного значения на другое) - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок в 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);
      },
    ),

Поскольку я новичок, если естьлучший способ сделать это, я тоже очень открыт!

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Итак, я смог исправить это, используя getDocuments () вместо снимков (). Listen ().Вот код, если у кого-то еще есть эта проблема

Future<void> changeSchool(school) async {
  CollectionReference schoolCollection =
      Firestore.instance.collection('School');

  CollectionReference studentCollection =
      Firestore.instance.collection('Student');

  QuerySnapshot schoolQuery = await schoolCollection
      .where('name', isEqualTo: school.name)
      .where('city', isEqualTo: school.city)
      .where('country', isEqualTo: school.country)
      .getDocuments();

  QuerySnapshot studentQuery = await studentCollection
      .where('email', isEqualTo: globals.currentUser.email)
      .getDocuments();

  final DocumentReference studentRef =
      studentCollection.document(studentQuery.documents[0].documentID);

  final DocumentReference ref =
      schoolCollection.document(schoolQuery.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());
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...