Мои данные структурированы следующим образом:
movies
внутри документа есть массив movieId
, который должен использоваться длязапросить информацию для каждого фильма из коллекции movies
.Жанр имеет ту же идею.Ключом к каждому документу из RecentMovieByGenre является идентификатор жанра, который я буду использовать для получения информации о жанре из коллекции genres
.
Я пытаюсь получить эти данные на сайте Front End моего приложения Flutter, используя шаблон блока, но это не так просто.
Пока у меня есть два класса блоков.В первом из них я ищу Genre(id, name)
из идентификатора жанра, а RecentMoviesBloc я получаю последниеMoviesById три.И был бы еще один класс, чтобы получить информацию о каждом фильме.Тогда я должен объединить два блока.Но это выглядит намного сложнее, чем должно быть.
class GetGenreByIdBloc implements BlocBase {
final StreamController<GenreVo> _genreController =
StreamController<GenreVo>();
Stream<GenreVo> get outGenres => _genreController.stream;
final StreamController<GenreVo> _inputController = StreamController<GenreVo>();
Sink get inSearch => _inputController.sink;
GetGenreByIdBloc() {
_inputController.stream.listen(_search);
}
@override
void dispose() {
_genreController.close();
_inputController.close();
}
void _search(GenreVo genre) {
var document = Firestore.instance.collection("genres").document(genre.id);
document.snapshots().listen((DocumentSnapshot event) {
var data = event.data;
_genreController.add(GenreVo.withMovies(data["code"], data["name"], genre.movies));
});
}
}
class RecentMoviesBloc implements BlocBase {
RecentMoviesBloc() {
_inputController.stream.listen(_input);
}
final StreamController<List<GenreVo>> _movieListStreamController =
StreamController<List<GenreVo>>();
Stream<List<GenreVo>> get outMovieList => _movieListStreamController.stream;
final StreamController<String> _inputController =
new StreamController<String>();
Sink get inTrigger => _inputController.sink;
@override
void dispose() {
_movieListStreamController.close();
_inputController.close();
}
void _input(String event) async {
Firestore.instance
.collection("recentMovieByGenre")
.snapshots()
.listen((querySnapshot) {
querySnapshot.documents.map((doc) {
var data = doc.data;
List movies = data["movies"];
List<MovieVo> movieList = movies.map((id) {
return MovieVo(id, "", 0);
}).toList();
GenreVo.withMovies(doc.documentID, "", movieList);
}).toList();
});
}
}
class RecentMoviesBloc implements BlocBase {
RecentMoviesBloc() {
_inputController.stream.listen(_input);
}
final StreamController<List<GenreVo>> _movieListStreamController =
StreamController<List<GenreVo>>();
Stream<List<GenreVo>> get outMovieList => _movieListStreamController.stream;
final StreamController<String> _inputController =
new StreamController<String>();
Sink get inTrigger => _inputController.sink;
@override
void dispose() {
_movieListStreamController.close();
_inputController.close();
}
void _input(String event) async {
Firestore.instance
.collection("recentMovieByGenre")
.snapshots()
.listen((querySnapshot) {
querySnapshot.documents.map((doc) {
var data = doc.data;
List movies = data["movies"];
List<MovieVo> movieList = movies.map((id) {
return MovieVo(id, "", 0);
}).toList();
GenreVo.withMovies(doc.documentID, "", movieList);
}).toList();
});
}
}
Я хотел бы знать, как я могу сделать это более простым способом и, если возможно, используя только один класс блока. Я думаю, что это должно быть возможноиспользуя RxDart, но я, но я не могу понять, как.