【问题标题】:How to filter data from user model created based on firestore database?如何从基于 Firestore 数据库创建的用户模型中过滤数据?
【发布时间】:2020-10-10 14:09:39
【问题描述】:

基于 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]);
      },
    );
  }
}

然后我用它通过我的屏幕传递数据,后来我通过一个列表视图显示了所有来自流的数据。无论如何,我的问题是,现在当我显示所有数据时,我想创建一个搜索按钮来显示任何特定的血型或任何特定的城市,而不是所有数据。我该怎么做?

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

【问题讨论】:

    标签: database flutter search google-cloud-firestore


    【解决方案1】:

    您可以针对集合引用使用 Firestore 查询方法来查询特定的文档记录

    查询数据的选项有wherelimitorderByAPI Reference

    编辑 - 无论您是要获取所有数据还是搜索它,都接受输入 在您的情况下,您可以将快照功能更改为类似的东西

    
      Stream<List<ReceiverModel>> fetchReceivers({String bloodGroup}) {
    
        var query = receiverCollection;
        if(bloodGroup!=null)
            query = query.where("bloodGroup",isEqualTo:bloodGroup);
               
        return query.snapshots().map(_receiverListFromSnapshot);
      }
    

    要添加严格搜索的搜索按钮,您可以使用键入的值调用该函数。

    希望我已经解决了您的问题。谢谢,祝你有美好的一天

    【讨论】:

    • 我在线程末尾添加了一个屏幕截图,说明我当前的输出现在是如何显示的。你能检查一下吗?好吧,我相信你的函数会改变所有的流。但是,我想显示所有数据,除非有人想按血组或城市过滤它。我必须为此创建另一个流吗?
    • 我试图根据你在我的数据库文件中编写一个单独的函数,并且它在 isEqualTo 下给出了一个错误:
    • 你能分享更多细节吗? receiverCollection 是 CollectionReference 的类型吗?
    • 我想你打错字了,isEqualtTo。无论如何,我想我找到了使用您的代码的解决方案,非常感谢,它有效。
    • 我的错误应该是`.where("bloodGroup", isEqualTo: bloodGroup)`
    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多