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.

150 lines
5.0KB

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