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.

192 lines
5.9KB

  1. import 'package:farm_tpf/custom_model/CropPlot.dart';
  2. import 'package:farm_tpf/data/repository/repository.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/bloc/widget_row_plot_info.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/presentation/screens/actions/sc_action.dart';
  7. import 'package:farm_tpf/utils/const_color.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:flutter_bloc/flutter_bloc.dart';
  10. import 'package:get/get.dart';
  11. import 'package:farm_tpf/utils/formatter.dart';
  12. import 'bloc/plot_detail_bloc.dart';
  13. class PlotHistoryScreen extends StatefulWidget {
  14. int cropId;
  15. String cropCode;
  16. int cropType;
  17. PlotHistoryScreen({this.cropId, this.cropCode, this.cropType});
  18. @override
  19. _PlotHistoryScreenState createState() => _PlotHistoryScreenState();
  20. }
  21. class _PlotHistoryScreenState extends State<PlotHistoryScreen>
  22. with AutomaticKeepAliveClientMixin {
  23. @override
  24. void initState() {
  25. super.initState();
  26. }
  27. @override
  28. void dispose() {
  29. super.dispose();
  30. }
  31. @override
  32. Widget build(BuildContext context) {
  33. return InfinityView(
  34. cropId: widget.cropId,
  35. cropCode: widget.cropCode,
  36. );
  37. }
  38. @override
  39. bool get wantKeepAlive => true;
  40. }
  41. class InfinityView extends StatefulWidget {
  42. int cropId;
  43. String cropCode;
  44. InfinityView({this.cropId, this.cropCode});
  45. @override
  46. _InfinityViewState createState() => _InfinityViewState();
  47. }
  48. class _InfinityViewState extends State<InfinityView> {
  49. var plotDetailBloc = PlotDetailBloc(repository: Repository());
  50. final _scrollController = ScrollController();
  51. final _scrollThreshold = 250.0;
  52. @override
  53. void initState() {
  54. plotDetailBloc
  55. .add(DataFetched(cropId: widget.cropId, cropCode: widget.cropCode));
  56. _scrollController.addListener(() {
  57. final maxScroll = _scrollController.position.maxScrollExtent;
  58. final currentScroll = _scrollController.position.pixels;
  59. if (maxScroll - currentScroll < _scrollThreshold) {
  60. plotDetailBloc
  61. .add(DataFetched(cropId: widget.cropId, cropCode: widget.cropCode));
  62. }
  63. });
  64. super.initState();
  65. }
  66. @override
  67. Widget build(BuildContext context) {
  68. return BlocBuilder<PlotDetailBloc, PlotDetailState>(
  69. cubit: plotDetailBloc,
  70. builder: (context, state) {
  71. if (state is PlotDetailFailure) {
  72. return Center(child: Text(state.errorString));
  73. }
  74. if (state is PlotDetailSuccess) {
  75. if (state.items.isEmpty) {
  76. return Center(
  77. child: Column(
  78. mainAxisSize: MainAxisSize.max,
  79. crossAxisAlignment: CrossAxisAlignment.center,
  80. mainAxisAlignment: MainAxisAlignment.center,
  81. children: [
  82. Text("Không có dữ liệu lịch sử canh tác"),
  83. OutlineButton(
  84. onPressed: () {
  85. plotDetailBloc.add(OnRefresh(
  86. cropId: widget.cropId, cropCode: widget.cropCode));
  87. },
  88. child: Text('Tải lại'),
  89. )
  90. ],
  91. ));
  92. }
  93. List<Activities> currentItems = List<Activities>.from(state.items);
  94. return SafeArea(
  95. child: Scaffold(
  96. body: RefreshIndicator(
  97. child: ListView.builder(
  98. padding: EdgeInsets.all(8),
  99. physics: AlwaysScrollableScrollPhysics(),
  100. itemBuilder: (BuildContext context, int index) {
  101. return index >= state.items.length
  102. ? BottomLoader()
  103. : ItemInfinityWidget(
  104. currentItems: currentItems,
  105. item: state.items[index],
  106. index: index,
  107. currentPage: state.page,
  108. currentReachedMax: state.hasReachedMax);
  109. },
  110. itemCount: state.hasReachedMax
  111. ? state.items.length
  112. : state.items.length + 1,
  113. controller: _scrollController,
  114. ),
  115. onRefresh: () async {
  116. plotDetailBloc.add(OnRefresh(
  117. cropId: widget.cropId, cropCode: widget.cropCode));
  118. }),
  119. ),
  120. );
  121. }
  122. return Center(
  123. child: LoadingListPage(),
  124. );
  125. },
  126. );
  127. }
  128. @override
  129. void dispose() {
  130. _scrollController.dispose();
  131. super.dispose();
  132. }
  133. }
  134. class ItemInfinityWidget extends StatelessWidget {
  135. final List<Activities> currentItems;
  136. final Activities item;
  137. final int currentPage;
  138. final bool currentReachedMax;
  139. final int index;
  140. const ItemInfinityWidget(
  141. {Key key,
  142. @required this.currentItems,
  143. @required this.item,
  144. @required this.currentPage,
  145. @required this.currentReachedMax,
  146. @required this.index})
  147. : super(key: key);
  148. @override
  149. Widget build(BuildContext context) {
  150. return GestureDetector(
  151. child: WidgetRowPlotInfo(
  152. color: index % 2 == 0
  153. ? AppColors.DEFAULT.withOpacity(0.3)
  154. : AppColors.DEFAULT.withOpacity(0.1),
  155. name: '${item.activityTypeDescription ?? ''}',
  156. value: item.executeDate.format_DDMMYY_HHmm() ?? ''),
  157. onTap: () {
  158. Get.to(ActionScreen(
  159. isEdit: true,
  160. cropId: item.cropId,
  161. activityId: item.id,
  162. activityType: item.activityTypeName,
  163. title: 'ActionScreen',
  164. idAction: item.activityTypeId,
  165. ));
  166. });
  167. }
  168. }
  169. class ActionType {
  170. Widget listScreen;
  171. String actionName;
  172. ActionType(String actionName, Widget listScreen) {
  173. this.actionName = actionName;
  174. this.listScreen = listScreen;
  175. }
  176. }