问题描述
我正在尝试从集合中查询一些文档,该查询应侦听查询的文档中所做的更改,因此我需要一个流.我正在关注(在Dart/Flutter中)
I'm trying to query a few documents from a collection, this query should listen to changes made in the queried documents, so I'd need a stream. I'm doing following (in Dart/Flutter)
Stream<List<MatchRequest>> _getNewMatches() {
return Collection<MatchRequest>(path: 'requests')
.ref
.where('status', isNull: true)
.where('users', arrayContains: ['$currentUid'])
.orderBy('last_activity')
.snapshots()
.map((list) => list.documents.map(
(doc) => Global.models[MatchRequest](doc.data) as MatchRequest));
}
(对象Collection会在其构造函数中设置ref的路径,例如:ref = db.collection($ path),然后地图会生成结果模型)
然后,我在stream
上使用StreamBuilder调用上述方法,并在builder
上检查是否有snapshot.hasData.但是它一直在加载,snapshot.hasData一直为假.我在这里做什么错了?
Then I'm using a StreamBuilder with stream
invoking the method above and builder
checking if snapshot.hasData. But it keeps loading, snapshot.hasData keeps being false. What am I doing wrong here?
-
我的firestore安全规则包含:
My firestore security rules contain:
match /requests/{requestId} {
allow read: if isLoggedIn();
allow write: if isLoggedIn();
}
删除每个where
和orderBy
时,也找不到任何内容.并且在requests-collection
When removing every where
and orderBy
, it doesn't find anything as well. And there are documents present in the requests-collection
当尝试仅从请求集合中以流形式查询1个文档时,他确实找到了结果
When trying to query only 1 document as a stream from the requests-collection, he does find the result
是因为我应该将索引添加到我的Firestore索引中吗?但这并不能解决我的第一个问题,即使没有where
和orderBy
,它也无法获取任何数据
Is it because I should add indexes to my firestore indexes? But this won't solve my first problem which is that even without where
and orderBy
, it doesn't get any data
推荐答案
我已经写了一个简单的示例,它看起来像您正在尝试执行的操作,但是缺少了listen()方法:
I've written a simple example of it seems to be like what you are trying to do but are missing the listen() method:
Firestore.instance.collection('collection')
.where('field', isEqualTo: 'value')
.orderBy('field')
.snapshots()
.listen((QuerySnapshot querySnapshot){
querySnapshot.documents.forEach((document) => print(document));
}
);
这只是如何从Firestore流中获取数据并在StreamBuilder上使用它的一个示例:
This is just an example of how you can take the data from a Firestore Stream and use it on a StreamBuilder:
class _MyHomePageState extends State<MyHomePage> {
Stream dataList;
@override
void initState() {
dataList = Firestore.instance.collection('collection')
.where('field', isEqualTo: 'value')
.orderBy('field')
.snapshots();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: StreamBuilder(
stream: dataList,
builder: (context, asyncSnapshot) {
if(asyncSnapshot.hasError)
return Text('Error: ${asyncSnapshot.error}');
switch (asyncSnapshot.connectionState) {
case ConnectionState.none: return Text('No data');
case ConnectionState.waiting: return Text('Awaiting...');
case ConnectionState.active:
return ListView(
children: asyncSnapshot.data.map((document) => Text(document['value'])),
);
break;
case ConnectionState.done: return ListView(
children: asyncSnapshot.data.map((document) => Text(document['value'])),
);
break;
}
return null;
}),
),
);
}
}
这篇关于Firestore集合查询在Flutter中作为流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!