Как отфильтровать данные из пользовательской модели, созданной на основе базы данных firestore? - PullRequest
0 голосов
/ 20 июня 2020

На основе базы данных firestore я создал свою собственную модель пользователя.

class ReceiverModel {
  
  final String id;
  final String name;
  final String contactNumber;
  final String bloodGroup;
  final String city;
  final String accepted;

  ReceiverModel({ this.id, this.name, this.contactNumber, this.bloodGroup, this.city, this.accepted });

}

И в моем файле базы данных я добавил поток для получения всех данных:

// Receiver List from snapshot
  List<ReceiverModel> _receiverListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.documents.map((doc){
      return ReceiverModel(
        id: doc.data['id'] ?? '',
        name: doc.data['name'] ?? '',
        contactNumber: doc.data['contactNumber'] ?? '',
        bloodGroup: doc.data['bloodGroup'] ?? '',
        city: doc.data['city'] ?? '',
        accepted: doc.data['accepted'] ?? '',
      );
    }).toList();
  }

  //get receiverCollection stream
  Stream<List<ReceiverModel>> get receivers {
    return receiverCollection.snapshots()
    .map(_receiverListFromSnapshot);
  }
@override
  Widget build(BuildContext context) {
    return StreamProvider<List<ReceiverModel>>.value(
      initialData: List(),
      value: ReceiverDatabaseService().receivers,
      child: SafeArea(
class _ReceiverListState extends State<ReceiverList> {
  @override
  Widget build(BuildContext context) {

    final receivers = Provider.of<List<ReceiverModel>>(context);
    
    return ListView.builder(
      itemCount: receivers.length,
      itemBuilder: (context, index) {
        return ReceiverTile(receiverModel: receivers[index]);
      },
    );
  }
}

Теперь вывод такой

Затем я использовал его для передачи данных через мои экраны, а позже я отображал все данные, которые проходили через поток, в виде списка. В любом случае, мой вопрос: теперь, когда я показываю все данные, я хочу создать кнопку поиска для отображения любых определенных c групп крови или любых определенных c городов, а не всех данных. Как я могу это сделать?

return StreamProvider<List<ReceiverModel>>.value(
      initialData: List(),
      value: ReceiverDatabaseService().receivers,

1 Ответ

1 голос
/ 20 июня 2020

Вы можете использовать методы Firestore Query по отношению к ссылке на коллекцию для запроса определенных записей документа.

Различные параметры, которые вы должны запрашивать, такие как where, limit, orderBy, и c . Справочник по API

Редактировать - Принимает ввод, хотите ли вы получить все данные или выполнить поиск в них. В вашем случае вы можете изменить функции снимков на что-то вроде этого


  Stream<List<ReceiverModel>> fetchReceivers({String bloodGroup}) {

    var query = receiverCollection;
    if(bloodGroup!=null)
        query = query.where("bloodGroup",isEqualTo:bloodGroup);
           
    return query.snapshots().map(_receiverListFromSnapshot);
  }

Для добавления кнопки поиска со строгим поиском вы можете вызвать функцию с введенным значением.

Надеюсь, я решил ваш запрос. Спасибо и хорошего дня

...