You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.3KB

  1. import 'package:farm_tpf/custom_model/EnvironmentParameter.dart';
  2. import 'package:farm_tpf/data/repository/repository.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart';
  4. import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
  5. import 'package:farm_tpf/utils/const_string.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter_bloc/flutter_bloc.dart';
  8. import 'package:farm_tpf/utils/formatter.dart';
  9. import 'bloc/plot_parameter_bloc.dart';
  10. class PlotParameterScreen extends StatefulWidget {
  11. final int cropId;
  12. PlotParameterScreen({@required this.cropId});
  13. @override
  14. _PlotParameterScreenState createState() => _PlotParameterScreenState();
  15. }
  16. class _PlotParameterScreenState extends State<PlotParameterScreen> {
  17. @override
  18. Widget build(BuildContext context) {
  19. return BlocProvider(
  20. create: (context) => PlotParameterBloc(repository: Repository())
  21. ..add(DataFetched(cropId: widget.cropId)),
  22. child: HoldInfinityWidget(
  23. cropId: widget.cropId,
  24. ),
  25. );
  26. }
  27. }
  28. class HoldInfinityWidget extends StatelessWidget {
  29. final int cropId;
  30. HoldInfinityWidget({@required this.cropId});
  31. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  32. @override
  33. Widget build(BuildContext context) {
  34. return Scaffold(
  35. key: _scaffoldKey,
  36. body: InfinityView(
  37. cropId: cropId,
  38. ));
  39. }
  40. }
  41. class InfinityView extends StatefulWidget {
  42. final int cropId;
  43. InfinityView({@required this.cropId});
  44. @override
  45. _InfinityViewState createState() => _InfinityViewState();
  46. }
  47. class _InfinityViewState extends State<InfinityView> {
  48. final _scrollController = ScrollController();
  49. final _scrollThreshold = 250.0;
  50. PlotParameterBloc _plotParameterBloc;
  51. @override
  52. void initState() {
  53. _scrollController.addListener(() {
  54. final maxScroll = _scrollController.position.maxScrollExtent;
  55. final currentScroll = _scrollController.position.pixels;
  56. if (maxScroll - currentScroll < _scrollThreshold) {
  57. _plotParameterBloc.add(DataFetched(cropId: widget.cropId));
  58. }
  59. });
  60. _plotParameterBloc = BlocProvider.of<PlotParameterBloc>(context);
  61. super.initState();
  62. }
  63. @override
  64. Widget build(BuildContext context) {
  65. return Column(
  66. children: <Widget>[
  67. Expanded(child: BlocBuilder<PlotParameterBloc, PlotParameterState>(
  68. builder: (context, state) {
  69. if (state is PlotParameterFailure) {
  70. return Center(child: Text(state.errorString));
  71. }
  72. if (state is PlotParameterSuccess) {
  73. if (state.items.isEmpty) {
  74. return Center(child: Text(label_list_empty));
  75. }
  76. return RefreshIndicator(
  77. child: ListView.builder(
  78. physics: AlwaysScrollableScrollPhysics(),
  79. itemBuilder: (BuildContext context, int index) {
  80. return index >= state.items.length
  81. ? BottomLoader()
  82. : ItemInfinityWidget(item: state.items[index]);
  83. },
  84. itemCount: state.hasReachedMax
  85. ? state.items.length
  86. : state.items.length + 1,
  87. controller: _scrollController,
  88. ),
  89. onRefresh: () async {
  90. _plotParameterBloc.add(OnRefresh(cropId: widget.cropId));
  91. });
  92. }
  93. return Center(
  94. child: LoadingListPage(),
  95. );
  96. },
  97. ))
  98. ],
  99. );
  100. }
  101. @override
  102. void dispose() {
  103. _scrollController.dispose();
  104. super.dispose();
  105. }
  106. }
  107. class ItemInfinityWidget extends StatelessWidget {
  108. final EnvironmentParameter item;
  109. const ItemInfinityWidget({Key key, @required this.item}) : super(key: key);
  110. @override
  111. Widget build(BuildContext context) {
  112. return Card(
  113. child: ListTile(
  114. title: Text(
  115. "${item.name ?? ''}",
  116. style: TextStyle(fontWeight: FontWeight.bold),
  117. ),
  118. subtitle: Text(
  119. item.index.formatNumtoStringDecimal(),
  120. style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
  121. ),
  122. trailing: Text(item.executeDate.format_DDMMYY_HHmm()),
  123. ),
  124. );
  125. }
  126. }