import 'dart:async'; import 'package:farm_tpf/custom_model/EnvironmentParameter.dart'; 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/utils/const_string.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:farm_tpf/utils/formatter.dart'; import 'bloc/plot_parameter_bloc.dart'; class PlotParameterScreen extends StatefulWidget { final int cropId; PlotParameterScreen({@required this.cropId}); @override _PlotParameterScreenState createState() => _PlotParameterScreenState(); } class _PlotParameterScreenState extends State { var plotParameterBloc = PlotParameterBloc(repository: Repository()); final _scrollController = ScrollController(); final _scrollThreshold = 250.0; @override void initState() { _scrollController.addListener(() { final maxScroll = _scrollController.position.maxScrollExtent; final currentScroll = _scrollController.position.pixels; if (maxScroll - currentScroll < _scrollThreshold) { plotParameterBloc.add(DataFetched(cropId: widget.cropId)); } }); plotParameterBloc.add(DataFetched(cropId: widget.cropId)); super.initState(); } @override Widget build(BuildContext context) { return Column( children: [ Expanded( child: BlocBuilder( cubit: plotParameterBloc, builder: (context, state) { if (state is PlotParameterFailure) { return Center(child: Text(state.errorString)); } if (state is PlotParameterSuccess) { 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() : ItemInfinityWidget(item: state.items[index]); }, itemCount: state.hasReachedMax ? state.items.length : state.items.length + 1, controller: _scrollController, ), onRefresh: () async { plotParameterBloc.add(OnRefresh(cropId: widget.cropId)); }); } return Center( child: LoadingListPage(), ); }, )) ], ); } @override void dispose() { _scrollController.dispose(); plotParameterBloc.close(); super.dispose(); } } class ItemInfinityWidget extends StatelessWidget { final EnvironmentParameter item; const ItemInfinityWidget({Key key, @required this.item}) : super(key: key); @override Widget build(BuildContext context) { return Card( child: ListTile( title: Text( "${item.name ?? ''}", style: TextStyle(fontWeight: FontWeight.bold), ), subtitle: Text( item.index.formatNumtoStringDecimal(), style: TextStyle( color: item.status ? Colors.red : Colors.blue, fontWeight: FontWeight.bold), ), trailing: Text(item.executeDate.format_DDMMYY_HHmm()), ), ); } }