Flutter GridView分页颤振
我正在尝试使用网格视图或列表视图在Flatter中实现分页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
// 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());
},
);
}