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.

152 lines
5.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: TextEditingController(),
  69. onPressed: (value) {
  70. FocusScope.of(context).requestFocus(FocusNode());
  71. BlocProvider.of<PlotBloc>(context).add(OnSearch(searchString: value));
  72. },
  73. ),
  74. ValueListenableBuilder<List<ItemDropDown>>(
  75. valueListenable: bloc.selectedSupply,
  76. builder: (context, selecteds, _) {
  77. return ValueListenableBuilder<List<ItemDropDown>>(
  78. valueListenable: bloc.supplies,
  79. builder: (context, status, _) {
  80. return MultipleSelectBottomSheet(
  81. dataSources: status,
  82. initValue: selecteds,
  83. onSelected: (val) {
  84. bloc.selectedSupply.value = val;
  85. Helpers.hideKeyboard(context);
  86. bloc.add(OnRefresh());
  87. },
  88. hint: 'Giống',
  89. );
  90. },
  91. );
  92. },
  93. ),
  94. Expanded(
  95. child: BlocBuilder<PlotBloc, PlotState>(
  96. bloc: bloc,
  97. builder: (context, state) {
  98. if (state is PlotFailure) {
  99. return Center(child: Text(state.errorString));
  100. }
  101. if (state is PlotSuccess) {
  102. if ((state.items ?? []).isEmpty) {
  103. return Center(child: Text(label_list_empty));
  104. }
  105. return RefreshIndicator(
  106. child: ListView.builder(
  107. physics: AlwaysScrollableScrollPhysics(),
  108. itemBuilder: (BuildContext context, int index) {
  109. return index >= (state.items ?? []).length
  110. ? BottomLoader()
  111. : ItemPlot(
  112. item: state.items?[index],
  113. onPressed: () {
  114. Navigator.push(
  115. context,
  116. MaterialPageRoute(
  117. builder: (BuildContext context) => PlotDetailScreen(
  118. cropId: state.items?[index].id ?? -1,
  119. initialIndex: 0,
  120. cropType: state.items?[index].tbCropTypeId ?? -1,
  121. ),
  122. ),
  123. );
  124. },
  125. );
  126. },
  127. itemCount: (state.hasReachedMax ?? false) ? (state.items ?? []).length : (state.items ?? []).length + 1,
  128. controller: _scrollController,
  129. ),
  130. onRefresh: () async {
  131. bloc.add(OnRefresh());
  132. },
  133. );
  134. }
  135. return Center(
  136. child: LoadingListPage(),
  137. );
  138. },
  139. ))
  140. ],
  141. ),
  142. ),
  143. );
  144. }
  145. }