코드
import 'movie_dates.dart';
import 'movie_result.dart';
class MovieData {
Dates dates;
int page;
List<MovieResult> results;
int totalPages;
int totalResults;
MovieData({
required this.dates,
required this.page,
required this.results,
required this.totalPages,
required this.totalResults,
});
factory MovieData.fromJson(Map<String, dynamic> json) {
return MovieData(
dates: Dates.fromJson(json['dates'] ?? {}),
page: json['page'] ?? 0,
results: (json['results'] != null
? List<MovieResult>.from(
json['results'].map((result) => MovieResult.fromJson(result)))
: []),
totalPages: json['total_pages'] ?? 0,
totalResults: json['total_results'] ?? 0,
);
}
Map<String, dynamic> toJson() {
return {
'dates': dates.toJson(),
'page': page,
'results': results.map((result) => result.toJson()).toList(),
'total_pages': totalPages,
'total_results': totalResults,
};
}
}
import 'dart:convert';
import '../dto/movie_data.dart';
import 'package:http/http.dart' as http;
class MovieApi {
Future<MovieData> fetchMovies({required String upcoming}) async {
final response = await http.get(Uri.parse(upcoming));
Map<String, dynamic> jsonData = jsonDecode(utf8.decode(response.bodyBytes));
MovieData movieData = MovieData.fromJson(jsonData);
return movieData;
}
}
class Movie {
final int id;
final String title;
final String originalTitle;
final String posterPath;
final String overview;
final String releaseDate;
final double voteAverage;
Movie({
required this.id,
required this.originalTitle,
required this.overview,
required this.posterPath,
required this.releaseDate,
required this.title,
required this.voteAverage,
});
factory Movie.fromJson(Map<String, dynamic> json) {
return Movie(
id: json['id'],
originalTitle: json['original_title'],
overview: json['overview'],
posterPath: json['poster_path'],
releaseDate: json['release_date'],
title: json['title'],
voteAverage: json['vote_average'].toDouble(),
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'title': title,
'originalTitle': originalTitle,
'posterPath': posterPath,
'overview': overview,
'releaseDate': releaseDate,
'voteAverage': voteAverage,
};
}
factory Movie.fromMap(Map<String, dynamic> json) {
return Movie(
id: json['id'] as int,
title: json['title'] as String,
originalTitle: json['originalTitle'] as String,
posterPath: json['posterPath'] as String,
overview: json['overview'] as String,
releaseDate: json['releaseDate'] as String,
voteAverage: json['voteAverage'] as double,
);
}
String toString() {
return 'Movie{id: $id, title: $title, originalTitle: $originalTitle, posterPath: $posterPath, overview: $overview, releaseDate: $releaseDate, voteAverage: $voteAverage}';
}
}
import 'package:basic/23_12_15/dto/movie_result.dart';
import '../model/movie.dart';
extension ToMovie on MovieResult {
Movie toMovie() {
return Movie(
id: id,
originalTitle: originalTitle,
overview: overview,
posterPath: posterPath,
releaseDate: releaseDate,
title: title,
voteAverage: voteAverage,
);
}
}
import 'dart:convert';
import 'package:basic/23_12_15/data_source/movie_api.dart';
import 'package:basic/23_12_15/dto/movie_data.dart';
import 'package:basic/23_12_15/mapper/movie_mapper.dart';
import 'model/movie.dart';
void main() async {
// api 통신
final api = MovieApi();
String url =
'https://api.themoviedb.org/3/movie/upcoming?api_key=a64533e7ece6c72731da47c9c8bc691f&language=ko-KR&page=1';
// json을 dto로
final MovieData dto = await api.fetchMovies(upcoming: url);
// print(dto);
// print(jsonEncode(dto.toJson()));
// dto에서 필요한 내용을 mapper를 통해 모델 클래스로 변환
final List<Movie> movies = dto.results.map((e) => e.toMovie()).toList();
print(movies.toString());
}