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.

111 lines
3.6KB

  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/bottom_loader.dart';
  5. import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
  6. import 'package:farm_tpf/utils/const_string.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter_bloc/flutter_bloc.dart';
  9. import 'package:farm_tpf/utils/formatter.dart';
  10. import 'bloc/plot_parameter_bloc.dart';
  11. class PlotParameterScreen extends StatefulWidget {
  12. final int cropId;
  13. PlotParameterScreen({@required this.cropId});
  14. @override
  15. _PlotParameterScreenState createState() => _PlotParameterScreenState();
  16. }
  17. class _PlotParameterScreenState extends State<PlotParameterScreen> {
  18. var plotParameterBloc = PlotParameterBloc(repository: Repository());
  19. final _scrollController = ScrollController();
  20. final _scrollThreshold = 250.0;
  21. @override
  22. void initState() {
  23. _scrollController.addListener(() {
  24. final maxScroll = _scrollController.position.maxScrollExtent;
  25. final currentScroll = _scrollController.position.pixels;
  26. if (maxScroll - currentScroll < _scrollThreshold) {
  27. plotParameterBloc.add(DataFetched(cropId: widget.cropId));
  28. }
  29. });
  30. plotParameterBloc.add(DataFetched(cropId: widget.cropId));
  31. super.initState();
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. return Column(
  36. children: <Widget>[
  37. Expanded(
  38. child: BlocBuilder<PlotParameterBloc, PlotParameterState>(
  39. cubit: plotParameterBloc,
  40. builder: (context, state) {
  41. if (state is PlotParameterFailure) {
  42. return Center(child: Text(state.errorString));
  43. }
  44. if (state is PlotParameterSuccess) {
  45. if (state.items.isEmpty) {
  46. return Center(child: Text(label_list_empty));
  47. }
  48. return RefreshIndicator(
  49. child: ListView.builder(
  50. physics: AlwaysScrollableScrollPhysics(),
  51. itemBuilder: (BuildContext context, int index) {
  52. return index >= state.items.length
  53. ? BottomLoader()
  54. : ItemInfinityWidget(item: state.items[index]);
  55. },
  56. itemCount: state.hasReachedMax
  57. ? state.items.length
  58. : state.items.length + 1,
  59. controller: _scrollController,
  60. ),
  61. onRefresh: () async {
  62. plotParameterBloc.add(OnRefresh(cropId: widget.cropId));
  63. });
  64. }
  65. return Center(
  66. child: LoadingListPage(),
  67. );
  68. },
  69. ))
  70. ],
  71. );
  72. }
  73. @override
  74. void dispose() {
  75. _scrollController.dispose();
  76. plotParameterBloc.close();
  77. super.dispose();
  78. }
  79. }
  80. class ItemInfinityWidget extends StatelessWidget {
  81. final EnvironmentParameter item;
  82. const ItemInfinityWidget({Key key, @required this.item}) : super(key: key);
  83. @override
  84. Widget build(BuildContext context) {
  85. return Card(
  86. child: ListTile(
  87. title: Text(
  88. "${item.name ?? ''}",
  89. style: TextStyle(fontWeight: FontWeight.bold),
  90. ),
  91. subtitle: Text(
  92. item.index.formatNumtoStringDecimal(),
  93. style: TextStyle(
  94. color: item.status ? Colors.red : Colors.blue,
  95. fontWeight: FontWeight.bold),
  96. ),
  97. trailing: Text(item.executeDate.format_DDMMYY_HHmm()),
  98. ),
  99. );
  100. }
  101. }