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.

137 lines
4.5KB

  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_color.dart';
  7. import 'package:farm_tpf/utils/const_string.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:flutter_bloc/flutter_bloc.dart';
  10. import 'package:farm_tpf/utils/formatter.dart';
  11. import 'bloc/plot_parameter_bloc.dart';
  12. class PlotParameterScreen extends StatefulWidget {
  13. final int cropId;
  14. PlotParameterScreen({@required this.cropId});
  15. @override
  16. _PlotParameterScreenState createState() => _PlotParameterScreenState();
  17. }
  18. class _PlotParameterScreenState extends State<PlotParameterScreen>
  19. with AutomaticKeepAliveClientMixin {
  20. var plotParameterBloc = PlotParameterBloc(repository: Repository());
  21. final _scrollController = ScrollController();
  22. final _scrollThreshold = 250.0;
  23. @override
  24. void initState() {
  25. _scrollController.addListener(() {
  26. final maxScroll = _scrollController.position.maxScrollExtent;
  27. final currentScroll = _scrollController.position.pixels;
  28. if (maxScroll - currentScroll < _scrollThreshold) {
  29. plotParameterBloc.add(DataFetched(cropId: widget.cropId));
  30. }
  31. });
  32. plotParameterBloc.add(DataFetched(cropId: widget.cropId));
  33. super.initState();
  34. }
  35. @override
  36. Widget build(BuildContext context) {
  37. return Column(
  38. children: <Widget>[
  39. Expanded(
  40. child: BlocBuilder<PlotParameterBloc, PlotParameterState>(
  41. cubit: plotParameterBloc,
  42. builder: (context, state) {
  43. if (state is PlotParameterFailure) {
  44. return Center(child: Text(state.errorString));
  45. }
  46. if (state is PlotParameterSuccess) {
  47. if (state.items.isEmpty) {
  48. return Center(child: Text(label_list_empty));
  49. }
  50. return RefreshIndicator(
  51. child: GridView.builder(
  52. gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  53. crossAxisCount: 2),
  54. physics: AlwaysScrollableScrollPhysics(),
  55. itemBuilder: (BuildContext context, int index) {
  56. return index >= state.items.length
  57. ? BottomLoader()
  58. : ItemInfinityWidget(item: state.items[index]);
  59. },
  60. itemCount: state.hasReachedMax
  61. ? state.items.length
  62. : state.items.length + 1,
  63. controller: _scrollController,
  64. ),
  65. onRefresh: () async {
  66. plotParameterBloc.add(OnRefresh(cropId: widget.cropId));
  67. });
  68. }
  69. return Center(
  70. child: LoadingListPage(),
  71. );
  72. },
  73. ))
  74. ],
  75. );
  76. }
  77. @override
  78. void dispose() {
  79. _scrollController.dispose();
  80. plotParameterBloc.close();
  81. super.dispose();
  82. }
  83. @override
  84. bool get wantKeepAlive => true;
  85. }
  86. class ItemInfinityWidget extends StatelessWidget {
  87. final EnvironmentParameter item;
  88. const ItemInfinityWidget({Key key, @required this.item}) : super(key: key);
  89. @override
  90. Widget build(BuildContext context) {
  91. return Container(
  92. margin: EdgeInsets.all(8),
  93. decoration: BoxDecoration(
  94. color: Colors.white,
  95. border: Border.all(color: Colors.grey[300], width: 0.35),
  96. borderRadius: BorderRadius.circular(8),
  97. boxShadow: [
  98. BoxShadow(
  99. color: Colors.grey[300], blurRadius: 4, offset: Offset(0, 3))
  100. ]),
  101. padding: EdgeInsets.all(8),
  102. child: Column(
  103. crossAxisAlignment: CrossAxisAlignment.start,
  104. children: [
  105. Text(
  106. item.index.formatNumtoStringDecimal(),
  107. style: TextStyle(
  108. color: item.status ? Colors.red : AppColors.YELLOW,
  109. fontWeight: FontWeight.bold,
  110. fontSize: 28),
  111. ),
  112. Expanded(child: Container()),
  113. Flexible(
  114. child: Text(
  115. "${item.name ?? ''}",
  116. maxLines: 2,
  117. style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
  118. ),
  119. ),
  120. Text(item.executeDate.format_DDMMYY_HHmm(),
  121. style: TextStyle(fontSize: 15, color: Colors.grey))
  122. ],
  123. ),
  124. );
  125. }
  126. }