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.

115 lines
3.7KB

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