Код, который у меня пока есть, такой:
Модель:
class SurveillanceAudit {
String auditer;
String auditee;
Timestamp date;
String comments;
String surveillanceAuditType;
bool external = false;
String addressLine1;
String addressLine2;
String town;
String county;
String postcode;
address() {
var array = [
this.addressLine1,
this.addressLine2,
this.town,
this.county,
this.postcode
];
return array.where((i) => i != null).join(', ');
}
SurveillanceAudit(
{this.auditer,
this.auditee,
this.date,
this.comments,
this.surveillanceAuditType,
this.external,
this.addressLine1,
this.addressLine2,
this.town,
this.county,
this.postcode});
}
Ссылка на коллекцию в Firestore:
final CollectionReference surveillanceAuditCollection =
Firestore.instance.collection('surveillanceAudit');
Функция, которая создает список объектов, используя модель, и данные из снимка коллекции:
List<SurveillanceAudit> _surveillanceAuditListFromSnapshot(
QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return SurveillanceAudit(
auditer: doc.data['auditer'] ?? '',
auditee: doc.data['auditee'] ?? '',
date: doc.data['date'] ?? '',
comments: doc.data['comments'] ?? '',
surveillanceAuditType: doc.data['surveillanceAuditType'] ?? '',
external: doc.data['external'] ?? false,
addressLine1: doc.data['addressLine1'] ?? '',
addressLine2: doc.data['addressLine2'] ?? '',
town: doc.data['town'] ?? '',
county: doc.data['county'] ?? '',
postcode: doc.data['postcode'] ?? '',
);
}).toList();
}
Некоторые отфильтрованные потоки списка объектов (где критерии, основанные на «внешнем», только для проверки цели, фактические критерии будут другими):
// get surveillanceAuditOpenCollection stream
Stream<List<SurveillanceAudit>> get surveillanceAuditsOpen {
return surveillanceAuditCollection
.where('external', isEqualTo: true)
.snapshots()
.map(_surveillanceAuditListFromSnapshot);
}
// get surveillanceAuditClosedCollection stream
Stream<List<SurveillanceAudit>> get surveillanceAuditsClosed {
return surveillanceAuditCollection
.where('external', isEqualTo: false)
.snapshots()
.map(_surveillanceAuditListFromSnapshot);
}
У меня также есть код, который должен обновлять документы, хотя я еще не использовал его:
Future updateSurveillanceAuditData(
String surveillanceAuditUID,
String auditer,
String auditee,
DateTime date,
String comments,
String surveillanceAuditType,
bool external,
String addressLine1,
String addressLine2,
String town,
String county,
String postcode,
) async {
return await surveillanceAuditCollection.document(surveillanceAuditUID).setData({
'auditer': auditer,
'auditee': auditee,
'date': date,
'comments': comments,
'surveillanceAuditType': surveillanceAuditType,
'external': external,
'addressLine1': addressLine1,
'addressLine2': addressLine2,
'town': town,
'county': county,
'postcode': postcode
});
}
У меня есть несколько вопросы.
1) Должен ли я фильтровать данные по исходной ссылке коллекции, а не после?
2) (Основной вопрос) Я успешно составил список данных который обновляется в реальном времени, используя StreamBuilder и ListView. Я хочу теперь иметь возможность нажать на ListTile, и это делает что-то вроде открытия нового экрана на основе указанного документа c. Поскольку я работаю с объектами, созданными на основе документов, я не могу использовать это для обновления, чтения, удаления и т. Д. c документов. Я думаю, что я должен иметь UID документов, хранящихся в объекте тоже как поле, добавив его в модель и установив его при сопоставлении документов с объектами. Это то, что нужно сделать?
3) Хорошо, "updateSurveillanceAuditData"?
4) Есть ли что-то принципиально неправильное / плохое в моем коде? Я следовал за учебником, но изменил вещи немного, чтобы удовлетворить то, что я хочу. Я мог бы сделать что-то совершенно не так, но не знаю.
Я был бы очень признателен за любую помощь. Я изо всех сил пытался разобраться с этими основами, просто потому, что, кажется, есть так много способов сделать вещи, которые все немного отличаются друг от друга, что я даже не представляю, как лучше всего это сделать.
Практически любой учебник, который я смотрю, который показывает основы c CRUD с Firestore отличается от других, я не могу просто копировать и изучать один способ, я должен узнать, как все работает в принципе, а затем работать лучше способ сделать что-то самому, довольно сложно разобраться.