#firebase #flutter #google-cloud-firestore #flutter-dependencies #provider
#firebase #flutter #google-cloud-firestore #flutter-зависимости #поставщик
Вопрос:
У меня есть экран просмотра, на котором я хочу отобразить всех клиентов. Клиенты отображаются в формате списка.
В моем классе CustomerNotifier я устанавливаю идентификатор клиента таким же, как идентификатор текущего пользователя, поэтому автоматически он должен отображать только клиентов, созданных текущим зарегистрированным пользователем.
getCustomers(CustomerNotifier customerNotifier) async {
String userId = (await FirebaseAuth.instance.currentUser()).uid;
print('Current logged in user uid is: $userId');
QuerySnapshot snapshot = await Firestore.instance
.collection('customers')
.where("id", isEqualTo: userId)
.orderBy('created_at', descending: true)
.getDocuments();
List<Customer> _customerList = [];
snapshot.documents.forEach((document) {
Customer customer = Customer.fromMap(document.data);
_customerList.add(customer);
});
customerNotifier.customerList = _customerList;
}
Future createOrUpdateCustomer(Customer customer, bool isUpdating) async {
CollectionReference customerRef =
await Firestore.instance.collection('customer');
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String userId = user.uid;
print('Current logged in user uid is: $userId');
if (isUpdating) {
customer.updatedAt = Timestamp.now();
await customerRef.document(userId).updateData(customer.toMap());
print('updated customer with id: ${customer.id}');
} else {
customer.createdAt = Timestamp.now();
DocumentReference documentReference = await customerRef.document(userId);
// add(customer.toMap());
customer.id = documentReference.documentID;
print('created customer successfully with id: ${customer.id}');
await documentReference.setData(customer.toMap(), merge: true);
addCustomer(customer);
}
notifyListeners();
}
Я могу успешно выполнить запись в базу данных. Однако чтение всех документов клиента и отображение клиентов, созданных CurrentUser (где идентификатор документа == uid текущего пользователя), не отображается в моем представлении списка клиентов.
Я занимаюсь этим уже несколько дней и, похоже, не могу понять, почему. Я был бы признателен за некоторую помощь в том, что я могу делать неправильно / упускать из виду.
Спасибо.
Пожалуйста, обратите внимание, что мои версии зависимостей проекта flutter указаны ниже:
firebase_core: ^0.4.5
firebase_auth: ^0.16.1
cloud_firestore: ^0.13.7
provider: ^4.3.1
firebase_storage: ^3.1.0
Комментарии:
1. Является
id
ли inwhere
ссылкой на documentId или поле в документе с именем id?2. Да, это так. Я отредактировал основной вопрос, чтобы включить скриншот моей firebase. он называется id.
3. Я также добавил свой класс модели клиента.
Ответ №1:
Ваша коллекция — «клиент», а не «клиенты» измените свой запрос на:
QuerySnapshot snapshot = await Firestore.instance
.collection('customer')
.where("id", isEqualTo: userId)
.orderBy('created_at', descending: true)
.getDocuments();
Комментарии:
1. Хороший улов! изменен на customer и now. Он показывает только недавно созданного клиента. Не все это создано текущим пользователем.
2. Проверьте все свои данные должным образом, возможно, вы создали предыдущие данные с другим идентификатором пользователя.
3. Вероятно, я должен. Он попросил меня создать составной индекс на облачной платформе Google, что я и сделал. Интересно, нормально ли это, поскольку я больше нигде этого не видел и раньше меня об этом не просили.
4. Я, наконец, понял, почему он отображает только последний созданный документ. Это связано с тем, что все документы создаются с одним и тем же идентификатором. Какова альтернатива этому? В первую очередь я думаю разрешить автоматическую генерацию идентификатора документа, пока я создаю поле с именем user_id в каждом документе и устанавливаю user_id в качестве идентификатора CurrentUser()? Есть ли еще один способ взломать это?
5. Составные индексы очень удобны для запросов firestore, они предназначены для индексации ваших данных для более быстрых и эффективных запросов. Для вашего второго комментария вы должны разрешить автоматическую генерацию идентификаторов документов, как вы предложили, и создать поле «id», чтобы ваше предложение «where» для запроса firestore работало.