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.

199 lines
6.4KB

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