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.

176 lines
6.5KB

  1. import 'package:farm_tpf/data/repository/repository.dart';
  2. import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
  4. import 'package:farm_tpf/presentation/screens/plot/widget_search.dart';
  5. import 'package:farm_tpf/presentation/screens/plot_detail/sc_plot_detail.dart';
  6. import 'package:farm_tpf/utils/pref.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter_bloc/flutter_bloc.dart';
  9. import 'package:farm_tpf/utils/const_string.dart';
  10. import '../../../models/item_dropdown.dart';
  11. import '../../../utils/helpers.dart';
  12. import '../../custom_widgets/dropdown/multiple_select_bottom_sheet.dart';
  13. import 'bloc/plot_bloc.dart';
  14. import 'widgets/item_plot.dart';
  15. class PlotListScreen extends StatefulWidget {
  16. @override
  17. _PlotListScreenState createState() => _PlotListScreenState();
  18. }
  19. class _PlotListScreenState extends State<PlotListScreen> {
  20. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  21. var pref = LocalPref();
  22. var token;
  23. var client;
  24. String pushkey = "";
  25. String currentFullName = "";
  26. PlotBloc bloc = PlotBloc(repository: Repository());
  27. final _scrollController = ScrollController();
  28. final _scrollThreshold = 250.0;
  29. @override
  30. void initState() {
  31. super.initState();
  32. bloc.preparedData();
  33. bloc.add(DataFetched());
  34. _scrollController.addListener(() {
  35. final maxScroll = _scrollController.position.maxScrollExtent;
  36. final currentScroll = _scrollController.position.pixels;
  37. if (maxScroll - currentScroll < _scrollThreshold) {
  38. bloc.add(DataFetched());
  39. }
  40. });
  41. }
  42. @override
  43. void dispose() {
  44. _scrollController.dispose();
  45. super.dispose();
  46. }
  47. @override
  48. Widget build(BuildContext context) {
  49. return Scaffold(
  50. backgroundColor: Colors.white,
  51. key: _scaffoldKey,
  52. body: SafeArea(
  53. child: Column(
  54. crossAxisAlignment: CrossAxisAlignment.start,
  55. children: <Widget>[
  56. SizedBox(
  57. height: 8,
  58. ),
  59. Container(
  60. padding: EdgeInsets.all(8),
  61. color: Colors.white,
  62. child: Text(
  63. 'Danh sách lô trồng',
  64. style: TextStyle(fontWeight: FontWeight.w500, fontSize: 22),
  65. ),
  66. ),
  67. WidgetSearch(
  68. searchController: bloc.searchCtl,
  69. onPressed: (value) {
  70. FocusScope.of(context).requestFocus(FocusNode());
  71. bloc.add(OnRefresh());
  72. },
  73. ),
  74. Row(
  75. children: [
  76. ValueListenableBuilder<List<ItemDropDown>>(
  77. valueListenable: bloc.selectedSupply,
  78. builder: (context, selecteds, _) {
  79. return ValueListenableBuilder<List<ItemDropDown>>(
  80. valueListenable: bloc.supplies,
  81. builder: (context, status, _) {
  82. return MultipleSelectBottomSheet(
  83. dataSources: status,
  84. initValue: selecteds,
  85. onSelected: (val) {
  86. bloc.selectedSupply.value = val;
  87. Helpers.hideKeyboard(context);
  88. bloc.add(OnRefresh());
  89. },
  90. hint: 'Giống',
  91. );
  92. },
  93. );
  94. },
  95. ),
  96. ValueListenableBuilder<List<ItemDropDown>>(
  97. valueListenable: bloc.selectedArea,
  98. builder: (context, selecteds, _) {
  99. return ValueListenableBuilder<List<ItemDropDown>>(
  100. valueListenable: bloc.areas,
  101. builder: (context, status, _) {
  102. return MultipleSelectBottomSheet(
  103. dataSources: status,
  104. initValue: selecteds,
  105. onSelected: (val) {
  106. bloc.selectedArea.value = val;
  107. Helpers.hideKeyboard(context);
  108. bloc.add(OnRefresh());
  109. },
  110. hint: 'Khu vực',
  111. );
  112. },
  113. );
  114. },
  115. ),
  116. ],
  117. ),
  118. Expanded(
  119. child: BlocBuilder<PlotBloc, PlotState>(
  120. bloc: bloc,
  121. builder: (context, state) {
  122. if (state is PlotFailure) {
  123. return Center(child: Text(state.errorString));
  124. }
  125. if (state is PlotSuccess) {
  126. if ((state.items ?? []).isEmpty) {
  127. return Center(child: Text(label_list_empty));
  128. }
  129. return RefreshIndicator(
  130. child: ListView.builder(
  131. physics: AlwaysScrollableScrollPhysics(),
  132. itemBuilder: (BuildContext context, int index) {
  133. return index >= (state.items ?? []).length
  134. ? BottomLoader()
  135. : ItemPlot(
  136. item: state.items?[index],
  137. onPressed: () {
  138. Navigator.push(
  139. context,
  140. MaterialPageRoute(
  141. builder: (BuildContext context) => PlotDetailScreen(
  142. cropId: state.items?[index].id ?? -1,
  143. initialIndex: 0,
  144. cropType: state.items?[index].tbCropTypeId ?? -1,
  145. ),
  146. ),
  147. );
  148. },
  149. );
  150. },
  151. itemCount: (state.hasReachedMax ?? false) ? (state.items ?? []).length : (state.items ?? []).length + 1,
  152. controller: _scrollController,
  153. ),
  154. onRefresh: () async {
  155. bloc.add(OnRefresh());
  156. },
  157. );
  158. }
  159. return Center(
  160. child: LoadingListPage(),
  161. );
  162. },
  163. ))
  164. ],
  165. ),
  166. ),
  167. );
  168. }
  169. }