Почему данные не обновляются в StreamBuilder? - PullRequest
0 голосов
/ 30 января 2019

Я делаю приложение со списком фильмов во Flutter, и когда я открываю приложение, я отображаю список самых просматриваемых фильмов.Когда я нажимаю кнопку, я выбираю новые данные и добавляю их в приемник, который затем отправляется в StreamBuilder и должен обновить экран новыми данными.
Но этого не происходит.Я не могу понять, почему!

Вот мой код для репозитория:

class MoviesRepository {
  final _movieApiProvider = MovieApiProvider();

  fetchAllMovies() async => _movieApiProvider.fetchMovieList();

  fetchAllSimilarMovies(genreIdeas) async => await _movieApiProvider.fetchMoviesLikeThis(genreIdeas);

  fetchTopRatedMovies() async => await _movieApiProvider.fetchTopRatedMovieList();
}

Вот мой код для блока:

class MoviesBloc {

  final _moviesRepository = MoviesRepository();
  final _moviesFetcher = BehaviorSubject<Result>();

  Sink<Result> get allMovies => _fetcherController.sink;
  final _fetcherController = StreamController<Result>();

  Observable<Result> get newResults => _moviesFetcher.stream;

  fetchAllMovies() async {
    Result model = await _moviesRepository.fetchAllMovies();
    allMovies.add(model);
  }

  fetchTopRatedMovies() async{
    Result model = await _moviesRepository.fetchTopRatedMovies();
    allMovies.add(model);
  }

  dispose() {
    _moviesFetcher.close();
    _fetcherController.close();
  }

  MoviesBloc() {
    _fetcherController.stream.listen(_handle);
  }


  void _handle(Result event) {

    _moviesFetcher.add(event);

  }
}

final bloc = MoviesBloc();

ОБНОВЛЕНИЕ

А вот мой код для StreamBuilder:

class HomeScreenListState extends State<HomeScreenList> {
  @override
  void initState() {
    super.initState();
    print("init");
    bloc.fetchAllMovies();
  }

  @override
  void dispose() {
    super.dispose();
    bloc.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<Result>(
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          print("new data is here");
          return buildList(snapshot);
        } else if (snapshot.hasError) {
          return Text('Error!!');
        }

        return Center(
          child: CircularProgressIndicator(),
        );
      },
      stream: bloc.newResults,
    );
  }
}

И это кнопка, которая вызывает получение новых данных и добавление их в приемник:

child: RaisedButton(onPressed: () {
                    bloc.fetchTopRatedMovies();
                  },

Эта кнопка выбирает фильмы с самым высоким рейтингом и добавляет их в тот же приемник.Теперь StreamBuilder должен подобрать новые данные, как я думаю.

В чем проблема ??

...