Я использую Flutterfire и «cloud_firestore» для извлечения данных из 2 коллекций пожарных хранилищ.
Вот моя логика:
- Сначала я получаю список встреч (из встречсбор) для врача, и я пытаюсь заказать по метке времени, используемой Firestore
- . Затем я перебираю этот список назначений и для каждого приема извлекаю данные пациента из отдельной подборки (сбор пациентов)
- Затем я добавляю каждую встречу в список и отображаю этот список в пользовательском интерфейсе.
Ошибка, которую я вижу, состоит в том, что список отображаемых встреч перемешивается. Я попытался отладить и посмотреть фактические данные, которые были получены, и кажется, что orderBy, кажется, работает, и снимок, полученный из firestore, имеет назначения в правильном порядке. Когда я выполняю дальнейшую обработку, он перемешивается.
Попробовав несколько вещей, я заметил, что если я не попытаюсь получить сведения о пациенте из коллекции пациента , и еслиВместо этого я получаю информацию о пациенте из локальной переменной, и я не вижу, чтобы эта проблема возникала. Отображаемый список встреч точно соответствует списку, который загружен и ведет себя, как ожидалось. Кажется, проблема возникает только тогда, когда я проверяю в пожарном депо дважды (один для назначений и второй раз для сведений о пациенте).
Вот фрагмент:
Future<Patient> fetchPatientFromFirebase(String patientId) async {
print("fetchPatientFromFirebase called");
var patientsCollection = Firestore.instance.collection('patients');
var patientSnapshot = await patientsCollection.document(patientId).get();
return Patient(
age: patientSnapshot['age'],
Firstname: patientSnapshot['FirstName'],
id: patientId,
LastName: patientSnapshot['LastName'],
sex: patientSnapshot['sex'] == "Male" ? Sex.Male : Sex.Female,
father: Parent(
),
mother: Parent(
));
}
Future<void> fetchAppointmentsFromFirebase() async {
var appointmentsCollection = Firestore.instance.collection('appointments');
fetchedAppointmentList.clear();
notifyListeners();
var apps = await appointmentsCollection
.orderBy('firebaseTimeStamp')
.getDocuments();
apps.documents.forEach((appointment) async {
var fetchedPatient = await fetchPatientFromFirebase(appointment['patient']);
// print(
// "Appoinments fetcheded and added ${appointment['patient'].toString()}. Patient is ${ds['FirstName']}");
fetchedAppointmentList.add(Appointment(
appointmentId: appointment['appointmentId'],
status: AppointmentStatus.values[appointment['status']],
// status: appointment['status'] == "Scheduled"
// ? AppointmentStatus.Scheduled
// : AppointmentStatus.Completed,
appointmentDateTime: DateTime.parse(appointment['appointmentDateTime']),
patient: fetchedPatient,
// patient: localPatients
// .firstWhere((patient) => patient.id == appointment['patient']),
));
// appointmentsCollection.snapshots().listen((data) {
// data.documents.forEach((doc) => print(doc["title"]));
// });
});
notifyListeners();
}
}
Вот как выглядит пожарное депокак:
Я хотел бы услышать любые предложения о том, как это исправить.