import 'package:farm_tpf/data/repository/repository.dart'; import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart'; import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart'; import 'package:farm_tpf/presentation/screens/plot/widget_search.dart'; import 'package:farm_tpf/presentation/screens/plot_detail/sc_plot_detail.dart'; import 'package:farm_tpf/utils/pref.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:farm_tpf/utils/const_string.dart'; import 'bloc/plot_bloc.dart'; import 'widgets/item_plot.dart'; class PlotListScreen extends StatefulWidget { @override _PlotListScreenState createState() => _PlotListScreenState(); } class _PlotListScreenState extends State { var pref = LocalPref(); var token; var client; String pushkey = ""; String currentFullName = ""; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlotBloc(repository: Repository())..add(DataFetched()), child: HoldInfinityWidget(), ); } } class HoldInfinityWidget extends StatelessWidget { final GlobalKey _scaffoldKey = new GlobalKey(); @override Widget build(BuildContext context) { return Scaffold(backgroundColor: Colors.white, key: _scaffoldKey, body: SafeArea(child: InfinityView())); } } class InfinityView extends StatefulWidget { @override _InfinityViewState createState() => _InfinityViewState(); } class _InfinityViewState extends State { final _scrollController = ScrollController(); final _scrollThreshold = 250.0; PlotBloc? _plotBloc; @override void initState() { _scrollController.addListener(() { final maxScroll = _scrollController.position.maxScrollExtent; final currentScroll = _scrollController.position.pixels; if (maxScroll - currentScroll < _scrollThreshold) { _plotBloc?.add(DataFetched()); } }); _plotBloc = BlocProvider.of(context); super.initState(); } @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: 8, ), Container( padding: EdgeInsets.all(8), color: Colors.white, child: Text( 'Danh sách lô trồng', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 22), ), ), WidgetSearch( searchController: TextEditingController(), onPressed: (value) { FocusScope.of(context).requestFocus(FocusNode()); BlocProvider.of(context).add(OnSearch(searchString: value)); }, ), Expanded(child: BlocBuilder( builder: (context, state) { if (state is PlotFailure) { return Center(child: Text(state.errorString)); } if (state is PlotSuccess) { if ((state.items ?? []).isEmpty) { return Center(child: Text(label_list_empty)); } return RefreshIndicator( child: ListView.builder( physics: AlwaysScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { return index >= (state.items ?? []).length ? BottomLoader() : ItemPlot( item: state.items?[index], onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (BuildContext context) => PlotDetailScreen( cropId: state.items?[index].id ?? -1, initialIndex: 0, cropType: state.items?[index].tbCropTypeId ?? -1, ), ), ); }, ); }, itemCount: (state.hasReachedMax ?? false) ? (state.items ?? []).length : (state.items ?? []).length + 1, controller: _scrollController, ), onRefresh: () async { _plotBloc?.add(OnRefresh()); }, ); } return Center( child: LoadingListPage(), ); }, )) ], ); } @override void dispose() { _scrollController.dispose(); super.dispose(); } }