在我的flutter应用程序中,我试图使用流显示用户保存的帖子。我需要从一个名为posts的集合中获取ID,然后尝试从另一个名为users的集合中的一个名为savedPostingIDs的数组中进行匹配。我在整个应用程序中都有信息流,但是由于我试图从两个不同的集合中获取信息,所以我无法弄清这一点。
我在页面上有一个流的示例为:
_stream = Firestore.instance
.collection('postings')
.where('type', isEqualTo: 'Arts & Culture')
.snapshots();
}
}
以上流将从我在应用程序中拥有的游戏类别中获取信息。我尝试过上面代码的不同变体,但是没有运气。这是我的第一个flutter应用程序,第一次使用firebase,因此非常感谢您的帮助和建议!预先谢谢你。
Here is an image that will show the information I'm trying to get.
答案 0 :(得分:1)
我相信您可能会使用flatMap
软件包中的combineLatest2
运算符或RxDart
运算符来实现所需的结果。
下面的代码示例查找类型等于“艺术与文化”的帖子,然后将该帖子转换为用户列表,其中已保存的帖子ID数组包含该帖子的ID。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance
.collection('postings')
.where(
'type',
isEqualTo: 'Arts & Culture',
)
.snapshots()
.flatMap((value) => FirebaseFirestore.instance
.collection('users')
.where(
'savedPostingIDs',
arrayContains: value.docs.first.id,
)
.snapshots()),
builder: (context, snapshot) {
return snapshot.connectionState == ConnectionState.done
? ListView.builder(
itemBuilder: (context, index) => ListTile(
title: Text(snapshot.data.docs[index].id),
),
itemCount: snapshot.data.docs.length,
)
: CircularProgressIndicator();
},
),
);
}
}
下面的代码示例将ID等于“ INSERT_USER_ID_HERE”的用户和类型等于“ Arts&Culture”的发布合并为一个已保存的发布ID的流。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder<List<String>>(
stream: Rx.combineLatest2<QuerySnapshot, QuerySnapshot, List<String>>(
FirebaseFirestore.instance
.collection('users')
.where(
'id',
isEqualTo: 'INSERT_USER_ID_HERE',
)
.snapshots(),
FirebaseFirestore.instance
.collection('postings')
.where(
'type',
isEqualTo: 'Arts & Culture',
)
.snapshots(),
(a, b) {
final user = a.docs.first.data();
final posting = b.docs.first.data();
return (user['savedPostingIDs'] as List<String>)
.where((element) => element == posting['id'])
.toList();
},
),
builder: (context, snapshot) {
return snapshot.connectionState == ConnectionState.done
? ListView.builder(
itemBuilder: (context, index) => ListTile(
title: Text(snapshot.data[index]),
),
itemCount: snapshot.data.length,
)
: CircularProgressIndicator();
},
),
);
}
}
如果您在运行上述任一代码示例时遇到任何问题,或者有任何疑问,请随时与我联系,我们很乐意为您服务!