Skip to content

Commit

Permalink
added infinite scrolling and pagination
Browse files Browse the repository at this point in the history
  • Loading branch information
SAGARSURI committed Aug 3, 2019
1 parent e3ab6ae commit e5ba19c
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 11 deletions.
17 changes: 13 additions & 4 deletions lib/src/blocs/movies_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,22 @@ import '../models/item_model.dart';

class MoviesBloc {
final _repository = Repository();
final _moviesFetcher = PublishSubject<ItemModel>();
final _moviesFetcher = BehaviorSubject<ItemModel>();
int totalPages = 1;

Observable<ItemModel> get allMovies => _moviesFetcher.stream;

fetchAllMovies() async {
ItemModel itemModel = await _repository.fetchAllMovies();
_moviesFetcher.sink.add(itemModel);
fetchAllMovies(int page) async {
if (page <= totalPages) {
ItemModel itemModel = await _repository.fetchAllMovies(page);
if (_moviesFetcher.value == null) {
totalPages = itemModel.total_pages;
_moviesFetcher.sink.add(itemModel);
} else {
_moviesFetcher.value.results.addAll(itemModel.results);
_moviesFetcher.sink.add(_moviesFetcher.value);
}
}
}

dispose() {
Expand Down
6 changes: 3 additions & 3 deletions lib/src/models/item_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class _Result {
bool _video;
String _vote_average;
String _title;
double _popularity;
String _popularity;
String _poster_path;
String _original_language;
String _original_title;
Expand All @@ -48,7 +48,7 @@ class _Result {
_video = result['video'];
_vote_average = result['vote_average'].toString();
_title = result['title'];
_popularity = result['popularity'];
_popularity = result['popularity'].toString();
_poster_path = result['poster_path'];
_original_language = result['original_language'];
_original_title = result['original_title'];
Expand Down Expand Up @@ -77,7 +77,7 @@ class _Result {

String get poster_path => _poster_path;

double get popularity => _popularity;
String get popularity => _popularity;

String get title => _title;

Expand Down
4 changes: 2 additions & 2 deletions lib/src/resources/movie_api_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ class MovieApiProvider {
final _apiKey = 'api-key';
final _baseUrl = "http://api.themoviedb.org/3/movie";

Future<ItemModel> fetchMovieList() async {
Future<ItemModel> fetchMovieList(int page) async {
Response response;
if(_apiKey != 'api-key') {
response = await client.get("$_baseUrl/popular?api_key=$_apiKey");
response = await client.get("$_baseUrl/popular?api_key=$_apiKey&page=$page");
}else{
throw Exception('Please add your API key');
}
Expand Down
2 changes: 1 addition & 1 deletion lib/src/resources/repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import '../models/trailer_model.dart';
class Repository {
final moviesApiProvider = MovieApiProvider();

Future<ItemModel> fetchAllMovies() => moviesApiProvider.fetchMovieList();
Future<ItemModel> fetchAllMovies(int page) => moviesApiProvider.fetchMovieList(page);

Future<TrailerModel> fetchTrailers(int movieId) => moviesApiProvider.fetchTrailer(movieId);
}
15 changes: 14 additions & 1 deletion lib/src/ui/movie_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,26 @@ class MovieList extends StatefulWidget {
}

class MovieListState extends State<MovieList> {
int _page = 1;
ScrollController _scrollController = new ScrollController();
bool isLoading = false;

@override
void initState() {
super.initState();
bloc.fetchAllMovies();
bloc.fetchAllMovies(_page);

_scrollController.addListener(() {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
bloc.fetchAllMovies(++_page);
}
});
}

@override
void dispose() {
_scrollController.dispose();
bloc.dispose();
super.dispose();
}
Expand All @@ -46,6 +58,7 @@ class MovieListState extends State<MovieList> {

Widget buildList(AsyncSnapshot<ItemModel> snapshot) {
return GridView.builder(
controller: _scrollController,
itemCount: snapshot.data.results.length,
gridDelegate:
new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
Expand Down

0 comments on commit e5ba19c

Please sign in to comment.