Как объединить запросы FireStore для составления объектов с использованием Bloc Pattern? - PullRequest
0 голосов
/ 29 января 2019

Мои данные структурированы следующим образом:

enter image description here

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, но я, но я не могу понять, как.

...