Line data Source code
1 : import 'package:tech_proof/data/repositories/movies_repository_imp.dart'; 2 : import 'package:tech_proof/presentation/widgets/tt_app_bar.dart'; 3 : import 'package:tech_proof/presentation/widgets/tt_loading_logo.dart'; 4 : import 'package:tech_proof/presentation/widgets/tt_movie_grid.dart'; 5 : import 'package:tech_proof/src/home/presentation/bloc/home_bloc.dart'; 6 : import 'package:flutter/material.dart'; 7 : import 'package:flutter_bloc/flutter_bloc.dart'; 8 : 9 : class HomePage extends StatelessWidget { 10 0 : const HomePage({super.key}); 11 : 12 0 : @override 13 : Widget build(BuildContext context) { 14 0 : return BlocProvider( 15 0 : create: (context) => HomeBloc( 16 0 : movieRepository: context.read<MovieRepositoryImpl>(), 17 0 : )..add(HomeInit()), 18 0 : child: BlocBuilder<HomeBloc, HomeState>( 19 0 : builder: (context, state) { 20 0 : return HomePageView( 21 : 22 : ); 23 : }, 24 : ), 25 : ); 26 : } 27 : } 28 : 29 : class HomePageView extends StatefulWidget { 30 1 : const HomePageView({super.key}); 31 : 32 1 : @override 33 1 : State<HomePageView> createState() => _HomePageViewState(); 34 : 35 : } 36 : 37 : class _HomePageViewState extends State<HomePageView> { 38 : final ScrollController _scrollController = ScrollController(); 39 : 40 1 : @override 41 : void initState() { 42 1 : super.initState(); 43 3 : _scrollController.addListener(_onScroll); 44 : } 45 : 46 1 : void _onScroll() { 47 4 : if (_scrollController.position.pixels >= 48 4 : _scrollController.position.maxScrollExtent - 200) { 49 4 : context.read<HomeBloc>().add(HomeShowLoading()); 50 4 : context.read<HomeBloc>().add(HomeLoadMore()); 51 : } 52 : } 53 : 54 1 : @override 55 : void dispose() { 56 : 57 2 : _scrollController.dispose(); 58 1 : super.dispose(); 59 : } 60 : 61 1 : @override 62 : Widget build(BuildContext context) { 63 2 : final currentState = context.watch<HomeBloc>().state; 64 : 65 2 : if (currentState is HomeLoading || currentState is HomeInitial) { 66 1 : return Column( 67 1 : children: [ 68 2 : Expanded(child: TtLoadingLogo()), 69 : ], 70 : ); 71 : } 72 1 : if (currentState is HomeReady) { 73 1 : return Scaffold( 74 1 : appBar: TtAppBar( 75 : title: 'Popular Movies', 76 : ), 77 1 : body: CustomScrollView( 78 1 : key: ValueKey('home_scroll_view'), 79 1 : controller: _scrollController, 80 1 : slivers: [ 81 1 : SliverPadding( 82 : padding: const EdgeInsets.all(24.0), 83 2 : sliver: TtMovieGrid(movieList: currentState.movies), 84 : ), 85 1 : if (currentState.isLoadingMore) 86 0 : SliverToBoxAdapter( 87 0 : child: Padding( 88 : padding: const EdgeInsets.all(16.0), 89 0 : child: TtLoadingLogo(), 90 : ), 91 : ), 92 : ], 93 : ), 94 : ); 95 : } 96 1 : if (currentState is HomeError) { 97 1 : return Scaffold( 98 1 : appBar: TtAppBar(), 99 1 : body: Center( 100 1 : child: Text('An error occurred. Please try again later.'), 101 : ), 102 : ); 103 : } 104 0 : return SizedBox.shrink(); 105 : } 106 : } 107 : 108 :