我想使用Streambuilder中的多个文档ID列表查询Firebase集合引用,但它似乎是唯一的
.where()
可用的查询功能是:
Query where(String field, {dynamic isEqualTo, dynamic isLessThan, dynamic isLessThanOrEqualTo, dynamic isGreaterThan, dynamic isGreaterThanOrEqualTo, dynamic arrayContains, bool isNull})
我已经测试过isEqualTo,如果我设置了要传入的字符串,则可以正常工作,但是无法将其用于列表。官方Firebase文档中似乎提供了一个IN函数,该函数最多可以提供10个项目:
https://firebase.google.com/docs/firestore/query-data/queries#in_and_array-contains-any
Flutter中是否有等效的IN函数或其他实现此目的的方法?我尝试传递的列表实际上是由父级Streambuilder提供的,该父级Streambuilder向特定用户查询User集合,并将所有组传递给第二个Streambuilder:
class _StarredChatState extends State<StarredChat> {
final _firestore = Firestore.instance;
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
final userID = user.uid;
return StreamBuilder<QuerySnapshot>(
stream: _firestore.collection('users/$userID/chats')
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
backgroundColor: Colors.lightBlueAccent,
),
);
}
List<String> ChatIDList = [];
final ChatIDs = snapshot.data.documents;
for(var x in ChatIDs) {
final ChatID = x.data['chats'].toString();
ChatIDList.add(ChatID);
}
return StreamBuilder<QuerySnapshot>(
stream: _firestore.collection('chatrooms')
// here is where I need the IN operator as neither
// arraycontains or isEqualTo give the desired result
.where('description', arrayContains: ChatIDList)
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
backgroundColor: Colors.lightBlueAccent,
),
);
}
//Here is where I want to return a ListBuilder for the above returned
//Streambuilder list
}
);
}
);
}
}
我的另一尝试是将所有加入聊天室的用户作为子集合包含在单独的聊天文档中,但是由于这些用户具有唯一的自动ID,因此我无法生成与特定用户的所有聊天流,因为我无法完整路径传递给嵌套子集合。任何其他指针将不胜感激。
谢谢
我的猜测是您使用的是FlutterFirecloud_firestore
插件的旧版本,因为whereIn
该库的当前版本中肯定存在该运算符。请参阅此处的参考文档。
您可能需要升级到最新版本的FlutterFire,以获得操作员。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句