Skip to content

Commit c524eb4

Browse files
committed
Add genre selection functionality to HomeCubit and update HomePage UI
1 parent bca75e2 commit c524eb4

File tree

3 files changed

+68
-13
lines changed

3 files changed

+68
-13
lines changed

lib/app/cubit/home_cubit.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import 'package:flutter_bloc/flutter_bloc.dart';
22
import 'package:tmdb_flutter/app/data/repository/movies_repository.dart';
33
import 'package:tmdb_flutter/app/cubit/home_state.dart';
4+
import 'package:tmdb_flutter/app/data/remote/models/movie_responses.dart';
45

56
class HomeCubit extends Cubit<HomeState> {
67
HomeCubit(this._repository) : super(HomeInitial());
78
final MoviesRepository _repository;
9+
810
MoviesRepository get repository => _repository;
911

1012
Future<void> loadHomeData() async {
@@ -22,13 +24,38 @@ class HomeCubit extends Cubit<HomeState> {
2224
popularMovies: popularMovies,
2325
upcomingMovies: upcomingMovies,
2426
genres: genres,
27+
selectedGenreId: null,
28+
filteredTrending: trendingMovies.results,
29+
filteredPopular: popularMovies.results,
30+
filteredUpcoming: upcomingMovies.results,
2531
),
2632
);
2733
} catch (e) {
2834
emit(HomeError(e.toString()));
2935
}
3036
}
3137

38+
void selectGenre(int? genreId) {
39+
if (state is HomeLoaded) {
40+
final loaded = state as HomeLoaded;
41+
List<Movie> filter(List<Movie> movies) => genreId == null
42+
? movies
43+
: movies
44+
.where((m) => m.genreIds?.contains(genreId) ?? false)
45+
.toList();
46+
emit(HomeLoaded(
47+
trendingMovies: loaded.trendingMovies,
48+
popularMovies: loaded.popularMovies,
49+
upcomingMovies: loaded.upcomingMovies,
50+
genres: loaded.genres,
51+
selectedGenreId: genreId,
52+
filteredTrending: filter(loaded.trendingMovies.results),
53+
filteredPopular: filter(loaded.popularMovies.results),
54+
filteredUpcoming: filter(loaded.upcomingMovies.results),
55+
));
56+
}
57+
}
58+
3259
Future<void> refreshHomeData() async {
3360
await loadHomeData();
3461
}

lib/app/cubit/home_state.dart

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,32 @@ class HomeLoaded extends HomeState {
1818
required this.popularMovies,
1919
required this.upcomingMovies,
2020
required this.genres,
21+
required this.filteredTrending,
22+
required this.filteredPopular,
23+
required this.filteredUpcoming,
24+
this.selectedGenreId,
2125
});
2226

2327
final MoviesResponse trendingMovies;
2428
final MoviesResponse popularMovies;
2529
final MoviesResponse upcomingMovies;
2630
final GenresResponse genres;
31+
final int? selectedGenreId;
32+
final List<Movie> filteredTrending;
33+
final List<Movie> filteredPopular;
34+
final List<Movie> filteredUpcoming;
2735

2836
@override
29-
List<Object?> get props =>
30-
[trendingMovies, popularMovies, upcomingMovies, genres];
37+
List<Object?> get props => [
38+
trendingMovies,
39+
popularMovies,
40+
upcomingMovies,
41+
genres,
42+
selectedGenreId,
43+
filteredTrending,
44+
filteredPopular,
45+
filteredUpcoming
46+
];
3147
}
3248

3349
class HomeError extends HomeState {

lib/app/view/home_page.dart

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class HomePage extends StatelessWidget {
4848
}
4949

5050
if (state is HomeLoaded) {
51+
final genres = state.genres.genres;
52+
final selectedGenreId = state.selectedGenreId;
53+
5154
return RefreshIndicator(
5255
onRefresh: () => context.read<HomeCubit>().refreshHomeData(),
5356
child: SingleChildScrollView(
@@ -107,12 +110,19 @@ class HomePage extends StatelessWidget {
107110
height: 36,
108111
child: ListView.builder(
109112
scrollDirection: Axis.horizontal,
110-
itemCount: state.genres.genres.length,
113+
itemCount: genres.length,
111114
itemBuilder: (context, index) {
112-
final genre = state.genres.genres[index];
115+
final genre = genres[index];
113116
return _CategoryChip(
114117
label: genre.name,
115-
selected: index == 0,
118+
selected: genre.id == selectedGenreId,
119+
onSelected: (selected) {
120+
if (selected) {
121+
context
122+
.read<HomeCubit>()
123+
.selectGenre(genre.id);
124+
}
125+
},
116126
);
117127
},
118128
),
@@ -131,9 +141,9 @@ class HomePage extends StatelessWidget {
131141
height: 240,
132142
child: ListView.builder(
133143
scrollDirection: Axis.horizontal,
134-
itemCount: state.trendingMovies.results.length,
144+
itemCount: state.filteredTrending.length,
135145
itemBuilder: (context, index) {
136-
final movie = state.trendingMovies.results[index];
146+
final movie = state.filteredTrending[index];
137147
return _MovieCard(
138148
movie: movie,
139149
borderColor: const Color(0xFFF9D949),
@@ -155,9 +165,9 @@ class HomePage extends StatelessWidget {
155165
height: 180,
156166
child: ListView.builder(
157167
scrollDirection: Axis.horizontal,
158-
itemCount: state.popularMovies.results.length,
168+
itemCount: state.filteredPopular.length,
159169
itemBuilder: (context, index) {
160-
final movie = state.popularMovies.results[index];
170+
final movie = state.filteredPopular[index];
161171
return _MovieCard(
162172
movie: movie,
163173
small: true,
@@ -179,9 +189,9 @@ class HomePage extends StatelessWidget {
179189
height: 180,
180190
child: ListView.builder(
181191
scrollDirection: Axis.horizontal,
182-
itemCount: state.upcomingMovies.results.length,
192+
itemCount: state.filteredUpcoming.length,
183193
itemBuilder: (context, index) {
184-
final movie = state.upcomingMovies.results[index];
194+
final movie = state.filteredUpcoming[index];
185195
return _MovieCard(
186196
movie: movie,
187197
small: true,
@@ -205,10 +215,12 @@ class HomePage extends StatelessWidget {
205215
}
206216

207217
class _CategoryChip extends StatelessWidget {
208-
const _CategoryChip({required this.label, this.selected = false});
218+
const _CategoryChip(
219+
{required this.label, this.selected = false, this.onSelected});
209220

210221
final String label;
211222
final bool selected;
223+
final ValueChanged<bool>? onSelected;
212224

213225
@override
214226
Widget build(BuildContext context) {
@@ -226,7 +238,7 @@ class _CategoryChip extends StatelessWidget {
226238
side: BorderSide(
227239
color: selected ? Colors.pinkAccent : Colors.black26,
228240
),
229-
onSelected: (_) {},
241+
onSelected: onSelected,
230242
),
231243
);
232244
}

0 commit comments

Comments
 (0)