Skip to content

Commit 300d594

Browse files
committed
Added watch later section
1 parent 1e61e22 commit 300d594

File tree

9 files changed

+341
-6
lines changed

9 files changed

+341
-6
lines changed

lib/data/movie_by_id.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import 'dart:convert';
2+
3+
import 'package:http/http.dart' as http;
4+
import 'package:megaflixz/models/movie.dart';
5+
6+
// void main() {
7+
// MovieIdList().getData();
8+
// }
9+
10+
class MovieById {
11+
final int movieId;
12+
MovieById({
13+
required this.movieId,
14+
});
15+
16+
Future<MovieModel> getData() async {
17+
String url =
18+
'https://api.themoviedb.org/3/movie/$movieId?api_key=997dd0df126bf7546140928361df293f';
19+
http.Response response = await http.get(Uri.parse(url));
20+
if (response.statusCode == 200) {
21+
dynamic data = response.body;
22+
dynamic json = jsonDecode(data);
23+
MovieModel model = MovieModel.fromJson(json);
24+
// print(model);
25+
return model;
26+
}
27+
else
28+
return MovieModel(id: 25, title: 'This should not be happening', overview: 'Nah', imgPath: '/q719jXXEzOoYaps6babgKnONONX.jpg');
29+
}
30+
}
31+
32+
class MovieIdList {
33+
final List<String> movieIdList;
34+
35+
MovieIdList({required this.movieIdList});
36+
37+
Future getData() async {
38+
List<Future<MovieModel>> futures = [];
39+
movieIdList.forEach((element) async {
40+
int id = int.parse(element);
41+
futures.add(MovieById(movieId: id).getData());
42+
// movieModel.add(model);
43+
// MovieById(movieId: id).getData().then((value) => movieModel.add(value));
44+
});
45+
List<MovieModel> value = await Future.wait(futures);
46+
47+
return value;
48+
// return movieModel;
49+
50+
// print(movieModel);
51+
}
52+
}

lib/data/tmdb.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class TMDB {
2222
MovieList model = MovieList.fromJson(json['results']);
2323
print(model.movieList.length);
2424
return model;
25-
// print(json['results'][0]['original_language']);
2625
}
2726
}
2827
}

lib/models/movie.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ class MovieModel {
1515
final String title;
1616
final String overview;
1717
final String imgPath;
18+
final int id;
1819
MovieModel({
20+
required this.id,
1921
required this.title,
2022
required this.overview,
2123
required this.imgPath,
2224
});
2325

2426
factory MovieModel.fromJson(Map<String, dynamic> parsedJson) {
25-
print(parsedJson['original_title']);
26-
print(parsedJson['poster_path']);
2727

2828
return MovieModel(
2929
title: parsedJson['original_title'],
3030
overview: parsedJson['overview'],
3131
imgPath:
32-
parsedJson['poster_path'] ?? '/q719jXXEzOoYaps6babgKnONONX.jpg');
32+
parsedJson['poster_path'] ?? '/q719jXXEzOoYaps6babgKnONONX.jpg',
33+
id: parsedJson['id']);
3334
}
3435
}

lib/screens/homepage.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:megaflixz/data/tmdb.dart';
33
import 'package:megaflixz/models/movie.dart';
4+
import 'package:megaflixz/screens/watch_later.dart';
45
import 'package:megaflixz/screens/widgets/drawer.dart';
56
import 'package:megaflixz/screens/widgets/movie_card.dart';
67

@@ -19,6 +20,14 @@ class _HomePageState extends State<HomePage> {
1920
return Scaffold(
2021
appBar: AppBar(
2122
title: Text('Megaflixz'),
23+
actions: [
24+
IconButton(
25+
onPressed: () {
26+
Navigator.of(context)
27+
.push(MaterialPageRoute(builder: (ctxt) => WatchLater()));
28+
},
29+
icon: Icon(Icons.movie))
30+
],
2231
centerTitle: true,
2332
),
2433
drawer: DrawerWid(),

lib/screens/movie_detailed.dart

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import 'package:flutter/material.dart';
2+
3+
import 'package:megaflixz/models/movie.dart';
4+
import 'package:shared_preferences/shared_preferences.dart';
5+
6+
class MovieDetailed extends StatefulWidget {
7+
final MovieModel model;
8+
const MovieDetailed({
9+
Key? key,
10+
required this.model,
11+
}) : super(key: key);
12+
13+
@override
14+
_MovieDetailedState createState() => _MovieDetailedState();
15+
}
16+
17+
class _MovieDetailedState extends State<MovieDetailed> {
18+
@override
19+
void initState() {
20+
super.initState();
21+
}
22+
23+
@override
24+
Widget build(BuildContext context) {
25+
return Scaffold(
26+
appBar: AppBar(),
27+
body: SingleChildScrollView(
28+
child: Column(
29+
children: [
30+
Image.network(
31+
'https://image.tmdb.org/t/p/w500${widget.model.imgPath}',
32+
// height: 400,
33+
),
34+
Text(
35+
widget.model.title,
36+
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
37+
),
38+
ElevatedButton(
39+
onPressed: () async {
40+
List<String>? exList = [];
41+
SharedPreferences sharedPreferences =
42+
await SharedPreferences.getInstance();
43+
if (sharedPreferences.containsKey('watchLater')) {
44+
exList = sharedPreferences.getStringList('watchLater');
45+
}
46+
print(exList);
47+
48+
if (exList != null) {
49+
if (exList.contains(widget.model.id.toString())) {
50+
ScaffoldMessenger.of(context).showSnackBar(
51+
SnackBar(content: Text("Already Added!")));
52+
} else {
53+
exList.add(widget.model.id.toString());
54+
sharedPreferences.setStringList('watchLater', exList);
55+
ScaffoldMessenger.of(context).showSnackBar(
56+
SnackBar(
57+
content: Text("Succesfully Added!"),
58+
),
59+
);
60+
}
61+
}
62+
},
63+
child: Text('Add to Watch Later'),
64+
),
65+
],
66+
),
67+
),
68+
);
69+
}
70+
}

lib/screens/watch_later.dart

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:megaflixz/data/movie_by_id.dart';
3+
import 'package:megaflixz/models/movie.dart';
4+
import 'package:megaflixz/screens/widgets/movie_card.dart';
5+
import 'package:shared_preferences/shared_preferences.dart';
6+
7+
class WatchLater extends StatefulWidget {
8+
const WatchLater({Key? key}) : super(key: key);
9+
10+
@override
11+
_WatchLaterState createState() => _WatchLaterState();
12+
}
13+
14+
class _WatchLaterState extends State<WatchLater> {
15+
List<MovieModel> moviesLists = [];
16+
17+
Future getInst() async {
18+
List<String>? exList = [];
19+
20+
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
21+
if (sharedPreferences.containsKey('watchLater')) {
22+
exList = sharedPreferences.getStringList('watchLater');
23+
return exList;
24+
}
25+
}
26+
27+
@override
28+
Widget build(BuildContext context) {
29+
return Scaffold(
30+
appBar: AppBar(title: Text('Watch Later'), centerTitle: true),
31+
body: FutureBuilder(
32+
future: getInst(),
33+
builder: (BuildContext context, AsyncSnapshot snapshot) {
34+
if (!snapshot.hasData)
35+
return Center(child: CircularProgressIndicator());
36+
if (snapshot.data.isEmpty) {
37+
return Center(
38+
child: Text(
39+
'It\'s empty in here!',
40+
style: TextStyle(fontSize: 20),
41+
),
42+
);
43+
}
44+
List<String> idList = snapshot.data;
45+
46+
return FutureBuilder(
47+
future: MovieIdList(movieIdList: idList).getData(),
48+
builder: (BuildContext context, AsyncSnapshot snapshot) {
49+
if (!snapshot.hasData)
50+
return Center(child: CircularProgressIndicator());
51+
moviesLists = snapshot.data;
52+
53+
return GridView.builder(
54+
padding: EdgeInsets.all(16.0),
55+
itemCount: moviesLists.length,
56+
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
57+
mainAxisSpacing: 5,
58+
crossAxisSpacing: 15,
59+
crossAxisCount: 2,
60+
childAspectRatio: 7.5 / 12),
61+
itemBuilder: (BuildContext context, int index) {
62+
return MovieCard(movieModel: moviesLists[index]);
63+
},
64+
);
65+
},
66+
);
67+
},
68+
),
69+
);
70+
}
71+
}

lib/screens/widgets/movie_card.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22

33
import 'package:megaflixz/models/movie.dart';
4+
import 'package:megaflixz/screens/movie_detailed.dart';
45

56
class MovieCard extends StatelessWidget {
67
final MovieModel movieModel;
@@ -11,7 +12,13 @@ class MovieCard extends StatelessWidget {
1112

1213
@override
1314
Widget build(BuildContext context) {
14-
return Container(
15+
return GestureDetector(
16+
onTap: (){
17+
18+
Navigator.of(context)
19+
.push(MaterialPageRoute(builder: (ctxt) => MovieDetailed(model: movieModel,)));
20+
21+
},
1522
// padding: EdgeInsets.all(16.0),
1623
// height: 300,
1724
// decoration: BoxDecoration(

0 commit comments

Comments
 (0)