【问题标题】:Filter documents of snapshot after received them [closed]收到快照后过滤文档[关闭]
【发布时间】:2021-05-23 19:55:58
【问题描述】:

我有 Streambuilder 从 Firestore 获取用户文档并将它们显示为 ListView,但我想控制在收到文档后谁出现以及谁将被忽略,我不能在所有情况下使用 (where),你可以阅读我的完整问题here

所以我想问一下有没有办法在收到文件后过滤文件?

【问题讨论】:

  • 不,我想通过一些过滤器来过滤它们,比如 isNotEqualTo、isEqualTo、isGreaterThanOrEqualTo 和 whereNotIn

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:
  1. 获取所有文档;
  2. 将它们保存在某处;
  3. 使用 .where( (YourModel element) => element.attribute == true ).toList(); 查询它们;
  4. 将查询的项目保存在另一个列表中并开始增长它;

更新--

我的意思的例子:

这很容易,你定义全局变量,如:

List<YourModel> listOfObjects;
List<YourModel> listOfObjectsQueried;

然后在构建器中您可以放置​​如下条件:

if(snapshot.hasData){
   listOfObjects = snapshot.data;
   listOfObjectsQueried = listOfObjects.where((YourModel element) => element.condition == true).toList();
}
if(listOfObjectsQueried != null) {
   return Container(
... here you show your listOfObjectQueried;
);
}
//if it is null
return CircularProgressIndicator();

【讨论】:

  • 您能否解释并展示从 streambuilder 收到文档后保存文档的示例?
  • @AbdullrahmanWasfi 我更新了帖子
【解决方案2】:

基于example in FlutterFire documentation:

class UserInformation extends StatelessWidget {
  final String cxurrentUid;

  const UserInformation({Key key, this.currentUid}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    CollectionReference users = FirebaseFirestore.instance.collection('users');
    Query query = users.where('age', isGreaterThan: 20);

    return StreamBuilder<QuerySnapshot>(
      stream: query.snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) {
          return Text('Something went wrong');
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text("Loading");
        }

        return new ListView(
          children: snapshot.data.documents
              .map((DocumentSnapshot document) => document.data())
              .where((data) => data['uid'] != currentUid)
              .map((data) => ListTile(
                  title: new Text(document.data()['full_name']),
                  subtitle: new Text(document.data()['company']),
                );
              ).toList(),
        );
      },
    );
  }
}

您不再使用List&lt;DocumentSnapshot&gt;,而不是Query

您必须转换您的isNotEqualToisEqualToisGreaterThanOrEqualTowhereNotIn

isNotEqualTowhere((data) =&gt; data[age] != 42

isEqualTowhere((data) =&gt; data[age] == 42

isGreaterThanOrEqualTowhere((data) =&gt; data[age] &gt;= 42

whereNotInwhere((data) =&gt; [42, 67, 239].conatins(data[age])

我还建议使用适当的类模型将您的 Firestore 文档转换为域实体。

【讨论】:

猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多