Flutter + Firebase Question
Я успешно опрашиваю свою Firebase одним запросом и возвращаю результаты в виде ListView, где каждый документ отображается в Card / ListTile. Теперь я хочу вернуть результаты двух запросов (взаимоисключающих, похожих на оператор OR) в одном ListView, но я не могу найти какое-либо решение для этого. Я полагаю, это должна быть простая и легкая процедура для объединения и отображения результатов запроса Firebase.
Я исследовал rxdart и использовал все виды потоковых функций слияния / объединения, но лучшее, что я могу сделать, это вернуть результаты одного запроса, который затем заменяется результатами второго запроса (т.е. результаты второго запроса заменяют первый). Как я могу отобразить оба результата моих запросов в одном ListView (как если бы это были результаты одного запроса, а не двух запросов / потоков)?
В моем home.dart у меня есть следующий код:
StreamProvider<List<Friendship>>.value(
value: DatabaseService(userEmail: userData.email).a3Friends,
...
Эта функция a3Friends определена в моем файле базы данных:
Stream<List<Friendship>> get a3Friends {
Stream<List<Friendship>> stream1 = Firestore.instance
.collection('friendships').where('user1_email', isEqualTo: userEmail).where('user_requested', isEqualTo: '').snapshots().map(_friendshipListFromSnapshot);
Stream<List<Friendship>> stream2 = Firestore.instance
.collection('friendships').where('user2_email', isEqualTo: userEmail).where('user_requested', isEqualTo: '').snapshots().map(_friendshipListFromSnapshot);
return stream1.mergeWith([stream2]);
}
Затем моя функция _friendshipListFromSnapshot также определена в моей базе данных следующим образом:
List<Friendship> _friendshipListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.documents.map((doc){
//print(doc.data);
return Friendship(
friendshipId: doc.documentID,
status: doc.data['status'],
userRequested: doc.data['user_requested'],
userBlocked: doc.data['user_blocked'],
user1Email: doc.data['user1_email'],
user1Name: doc.data['user1_name'],
user2Email: doc.data['user2_email'],
user2Name: doc.data['user2_name'],
);
}).toList();
}
Наконец, этот список печатается здесь:
class FriendList extends StatefulWidget {
@override
_FriendListState createState() => _FriendListState();
}
class _FriendListState extends State<FriendList> {
@override
Widget build(BuildContext context) {
final a3Friends = Provider.of<List<Friendship>>(context) ?? [];
if (a3Friends.length == 0) {
return Center(
child: Image(
image: AssetImage('assets/coffee_icon.png')
)
);
}
else {
return Container(
child: ListView.builder(
shrinkWrap: true,
itemCount: a3Friends.length,
itemBuilder: (context, index) {
return FriendTile(friendship: a3Friends[index]);
},
)
);
}
}
}
Приведенный выше код сохраняет и работает без ошибок, но не выполняет то, что я хочу. В настоящее время этот код может выполнять и возвращать запросы от stream1 и stream2, но результаты stream1 сначала печатаются в моем ListView, а затем заменяются результатами stream2 (т.е. в конечном итоге отображаются только результаты из stream2). Я хочу, чтобы оба моих результата из stream1 и stream2 были как-то объединены, объединены или объединены для отображения в моем ListView.