对收到的快照文档进行过滤



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

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

  1. 获取所有文档;
  2. 把它们保存在某个地方;
  3. 使用.where((YourModel element) =>元素。
  4. 将查询的项目保存在另一个列表中并开始增长;
  5. 更新——

我的意思的例子:

这很简单,你可以定义全局变量:

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();

基于FlutterFire文档中的示例:

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<DocumentSnapshot>,而不是Query

您将不得不转换您的isNotEqualTo,isEqualTo,isGreaterThanOrEqualTowhereNotIn:

isNotEqualTowhere((data) => data[age] != 42 isEqualTowhere((data) => data[age] == 42 isGreaterThanOrEqualTowhere((data) => data[age] >= 42 whereNotInwhere((data) => [42, 67, 239].conatins(data[age])

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

最新更新