130 lines
5.1 KiB
Dart
130 lines
5.1 KiB
Dart
import 'package:card_loading/card_loading.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:gap/gap.dart';
|
|
import 'package:skripsi_getit/data/state/movie_state.dart';
|
|
import 'package:skripsi_getit/services/cubit/detail_movie_cubit.dart';
|
|
import 'package:skripsi_getit/themes/colors.dart';
|
|
import 'package:skripsi_getit/themes/fonts.dart';
|
|
import 'package:skripsi_getit/ui/home/detail/widgets/detail_movie_header.dart';
|
|
import 'package:skripsi_getit/ui/home/detail/widgets/recommendations_movie.dart';
|
|
import 'package:skripsi_getit/ui/home/detail/widgets/videos_movie.dart';
|
|
import 'package:skripsi_getit/utils/extensions.dart';
|
|
|
|
class DetailMovie extends StatefulWidget {
|
|
final int movieId;
|
|
const DetailMovie({super.key, required this.movieId});
|
|
|
|
@override
|
|
State<DetailMovie> createState() => _DetailMovieState();
|
|
}
|
|
|
|
class _DetailMovieState extends State<DetailMovie> {
|
|
late DetailMovieCubit detailMovieCubit;
|
|
|
|
@override
|
|
void initState() {
|
|
// TODO: implement initState
|
|
super.initState();
|
|
detailMovieCubit = context.read<DetailMovieCubit>();
|
|
detailMovieCubit.getDetailMovies(widget.movieId);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final deviceSize = context.deviceSize;
|
|
return Scaffold(
|
|
backgroundColor: primaryColor,
|
|
body: SafeArea(
|
|
child: SingleChildScrollView(
|
|
physics: const BouncingScrollPhysics(),
|
|
child: BlocBuilder<DetailMovieCubit, DetailMovieState>(
|
|
builder: (context, state) {
|
|
if (state.isLoading) {
|
|
return Center(
|
|
child: CircularProgressIndicator(color: whiteColor),
|
|
);
|
|
} else if (state.errorMessage.isNotEmpty) {
|
|
return Center(
|
|
child: Text(
|
|
"Error: ${state.errorMessage}",
|
|
style: AppFonts.montserrat(fontSize: 12, color: whiteColor),
|
|
),
|
|
);
|
|
// ignore: unnecessary_null_comparison
|
|
} else if (state.movies != null) {
|
|
final movie = state.movies;
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
movie.backdropPath != null
|
|
? DetailMovieHeader(detailMovie: movie)
|
|
: CardLoading(height: 250, width: deviceSize.width),
|
|
VideosMovie(movieId: widget.movieId),
|
|
Padding(
|
|
padding: const EdgeInsets.all(15.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
CircleAvatar(
|
|
radius: 30,
|
|
backgroundColor: whiteColor,
|
|
child: CircleAvatar(
|
|
radius: 28,
|
|
backgroundColor: primaryColor,
|
|
child: Text(
|
|
movie.voteAverage != null
|
|
? '${(movie.voteAverage! * 10).toStringAsFixed(0)}%'
|
|
: 'N/A',
|
|
style: AppFonts.montserrat(
|
|
fontSize: 14,
|
|
color: whiteColor,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
const Gap(8),
|
|
Text(
|
|
"Vote\nAverage",
|
|
style: AppFonts.montserrat(
|
|
fontSize: 14,
|
|
color: whiteColor,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
const Gap(14),
|
|
Text(
|
|
movie.overview ?? "",
|
|
style: AppFonts.montserrat(
|
|
fontSize: 12,
|
|
color: whiteColor,
|
|
fontWeight: FontWeight.normal,
|
|
),
|
|
),
|
|
const Gap(10),
|
|
RecommendationsMovie(movieId: widget.movieId),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
return Center(
|
|
child: Text(
|
|
"No movie details available.",
|
|
style: AppFonts.montserrat(fontSize: 12, color: whiteColor),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|