我正在尝试从集合中查询一些文档,该查询应侦听查询的文档中所做的更改,因此我需要一个流。我正在关注(在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
调用上述方法并使用builder
检查Streaming.hasData的StreamBuilder。但是它一直在加载,snapshot.hasData一直为假。我在这里做什么错了?
编辑:
我的firestore安全规则包含:
match /requests/{requestId} {
allow read: if isLoggedIn();
allow write: if isLoggedIn();
}
删除每个where
和orderBy
时,也找不到任何东西。并在requests-collection
当尝试仅从请求集合中以流形式查询1个文档时,他确实找到了结果
是因为应该将索引添加到Firestore索引中吗?但这不能解决我的第一个问题,即即使没有where
和orderBy
,也不会得到任何数据
答案 0 :(得分:1)
我已经写了一个简单的示例,它看起来就像您要尝试执行的操作,但是缺少了listen()方法:
Firestore.instance.collection('collection')
.where('field', isEqualTo: 'value')
.orderBy('field')
.snapshots()
.listen((QuerySnapshot querySnapshot){
querySnapshot.documents.forEach((document) => print(document));
}
);
这只是如何从Firestore流中获取数据并在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;
}),
),
);
}
}