, поэтому у меня есть запрос firebase, где:
user
document - имеет массив идентификаторов Spots
posts
collection - имеет несколько post
документов, и каждое сообщение имеет один "spotId"
spots
collection - содержит несколько spot
документов с уникальным идентификатором obvs
Теперь, чтобы отображать только для пользователя Сообщения о точках, за которыми следует этот пользователь, я должен:
Итерировать пользователя "массив точек" ( пятна, за которыми он следует). Затем для каждого spot id
из этого массива я должен выполнить запрос firebase к коллекции posts
, где «spotId» == этот идентификатор. Поэтому, когда у меня есть только те сообщения, связанные с пользователем Spot, я должен выполнить еще один запрос firebase к коллекции spots
, чтобы получить эти данные c Spot для отображения сообщений.
Метод выглядит следующим образом:
@override
Stream<List<Future<Post>>> posts(List userFollowedSpots) {
final listOfStreams = userFollowedSpots.map((id) {
return postCollection
.where("spotId", isEqualTo: id)
.snapshots()
.map((snapshot) {
return snapshot.documents.map((doc) {
return spotCollection.document(doc.data["spotId"]).get().then((ds) {
return Post.fromEntity(PostEntity.fromSnapshot(doc, ds));
});
}).toList();
});
});
return StreamGroup.merge(listOfStreams); // <-- have to merge it as mapped userFollowedSpots returns Iterable<Stream...>>>>
}
Тогда я использую это так:
Stream<PostsState> _mapLoadPostToState(LoadPosts event) async* {
List<Post> allPosts = [];
_postsSubscription?.cancel();
if (event.userFollowedSpots != null && event.userFollowedSpots.length > 0) {
_postsSubscription =
_postRepository.posts(event.userFollowedSpots).listen((posts) {
Future.wait(posts).then((waitedPosts) {
if (allPosts.length > 0) {
allPosts = allPosts + waitedPosts;
} else {
allPosts = waitedPosts;
}
add(PostUpdated(allPosts));
});
});
}
}
Вопрос: имеет ли смысл? Потому что выглядит как маленький взломать. Обычно я ожидаю один поток от этого posts
метода, но вот что: когда я буду слушать этот post
метод Steam, Firebase будет возвращать новый event
для каждого идентификатора из массива идентификатора. Так что если массив будет ["1", "2"], то Future.wait(posts).then((waitedPosts)
вернет сообщение для "1", а затем для "2".
Вот почему я сделал этот странный хак - я начал работать с flutter_blo c, поэтому не можете определить, является ли это хаком или приемлемым решением?
Может кто-нибудь помочь с мнением?