Flutter GridView分页颤振

Flutter GridView分页颤振,flutter,gridview,pagination,Flutter,Gridview,Pagination,我正在尝试使用网格视图或列表视图在Flatter中实现分页 // final movieRepository = dependencyInjector.get<MovieRepository>(); MoviesRepository movieRepository; /// BehaviorSubject<T> StreamController that captures the latest item that has been /// added t

我正在尝试使用网格视图或列表视图在Flatter中实现分页

  // final movieRepository = dependencyInjector.get<MovieRepository>();
  MoviesRepository movieRepository;

  /// BehaviorSubject<T> StreamController that captures the latest item that has been
  /// added to the controller, and emits that as the first item to any new listener.
  BehaviorSubject moviesEventController = BehaviorSubject<MoviesModel>();

  ValueStream<MoviesModel> get moviesSubscription =>
      moviesEventController.stream;

  bool isLoading = false;
  int _page = 1;
  int _maxPage = 2;
  PublishSubject<MoviesModel> nextPageController = PublishSubject();
  Stream<MoviesModel> get nextPageSubscription => nextPageController.stream;

  MoviesBloc({@required this.movieRepository}) {
    movieRepository = MoviesRepositoryImpl(service: MovieService());
    moviesEventController.onListen = () => _fetchMovies();

    nextPageController.onListen = () => _getMoreMovies();
  }

  _fetchMovies() async {
    MoviesBaseResponse response = await movieRepository.fetchMovies(_page);

    if (response != null) {
      MoviesModel model = MoviesModel(
        page: response.page,
        movies: _getMovieList(response.movies),
      );
      moviesEventController.sink.add(model);
    }
  }

  _getMoreMovies() async {
    if(_page < _maxPage) {
      _page++;
      isLoading = true;
      MoviesBaseResponse response = await movieRepository.fetchMovies(_page);
      isLoading = false;
      if(response != null) {
        _maxPage = response.totalPages;
        nextPageController.sink.add(_createMoviesModel(response));
      }
    }
  }

  List<MovieModel> _getMovieList(List<MovieResponse> response) {
    List<MovieModel> modelList = [];

    response.forEach((movie) {
      MovieModel model = MovieModel(
        video: movie.video,
        posterPath: posterEndpoint + movie.posterPath,
        movieId: movie.id,
        adult: movie.adult,
        backdropPath: backdropEndpoint + movie.backdropPath,
        title: movie.title ?? movie.originalTitle,
        overview: movie.overview,
        releaseDate: movie.releaseDate,
      );
      modelList.add(model);
    });

    return modelList;
  }

  MoviesModel _createMoviesModel(MoviesBaseResponse response) {
    return MoviesModel(
      page: response.page,
      totalPages: response.totalPages,
      totalResult: response.totalResults,
      movies: _getMovieList(response.movies)
    );
  }

}
onNotification
在StreamBuilder中被调用为:

    return StreamBuilder<MoviesModel>(
      stream: bloc.moviesSubscription,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return NotificationListener<ScrollNotification>(
            onNotification: (notification) => onNotification(notification, bloc),
            child: _gridViewBuilder(context, snapshot.data)
          );
        } else if (snapshot.hasError) {
          return ErrorMessage(
            message: CommonStrings().genericErrorMessage,
          );
        }
        return Center(child: LoadingWidget());
      },
    );
  }
返回StreamBuilder(
流:bloc.moviesSubscription,
生成器:(上下文,快照){
if(snapshot.hasData){
返回通知侦听器(
onNotification:(通知)=>onNotification(通知,集团),
子项:_gridViewBuilder(上下文、快照.数据)
);
}else if(snapshot.hasrerror){
返回错误消息(
消息:CommonString().genericErrorMessage,
);
}
返回中心(子:LoadingWidget());
},
);
}
所以现在,分页似乎不起作用。它不会加载滚动条上的第二页。让我知道我可能错过了什么。提前谢谢

    return StreamBuilder<MoviesModel>(
      stream: bloc.moviesSubscription,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return NotificationListener<ScrollNotification>(
            onNotification: (notification) => onNotification(notification, bloc),
            child: _gridViewBuilder(context, snapshot.data)
          );
        } else if (snapshot.hasError) {
          return ErrorMessage(
            message: CommonStrings().genericErrorMessage,
          );
        }
        return Center(child: LoadingWidget());
      },
    );
  }