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.

134 lines
4.0KB

  1. import 'package:dio/dio.dart';
  2. import 'package:farm_tpf/data/repository/repository.dart';
  3. import 'package:farm_tpf/models/Plot.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/bloc/infinity_scroll_bloc.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. class PlotListScreen extends StatefulWidget {
  11. @override
  12. _PlotListScreenState createState() => _PlotListScreenState();
  13. }
  14. class _PlotListScreenState extends State<PlotListScreen> {
  15. @override
  16. Widget build(BuildContext context) {
  17. return BlocProvider(
  18. create: (context) =>
  19. InfinityScrollBloc(repository: Repository())..add(DataFetched()),
  20. child: HoldInfinityWidget(),
  21. );
  22. }
  23. }
  24. class HoldInfinityWidget extends StatelessWidget {
  25. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  26. @override
  27. Widget build(BuildContext context) {
  28. return Scaffold(
  29. key: _scaffoldKey,
  30. appBar: AppBar(
  31. centerTitle: true,
  32. title: Text("Danh sách lô"),
  33. actions: <Widget>[
  34. IconButton(icon: Icon(Icons.add), onPressed: () {})
  35. ],
  36. ),
  37. body: InfinityView());
  38. }
  39. }
  40. class InfinityView extends StatefulWidget {
  41. @override
  42. _InfinityViewState createState() => _InfinityViewState();
  43. }
  44. class _InfinityViewState extends State<InfinityView> {
  45. final _scrollController = ScrollController();
  46. final _scrollThreshold = 250.0;
  47. InfinityScrollBloc _infinityScrollBloc;
  48. @override
  49. void initState() {
  50. _scrollController.addListener(() {
  51. final maxScroll = _scrollController.position.maxScrollExtent;
  52. final currentScroll = _scrollController.position.pixels;
  53. if (maxScroll - currentScroll < _scrollThreshold) {
  54. _infinityScrollBloc.add(DataFetched());
  55. }
  56. });
  57. _infinityScrollBloc = BlocProvider.of<InfinityScrollBloc>(context);
  58. super.initState();
  59. }
  60. @override
  61. Widget build(BuildContext context) {
  62. return BlocBuilder<InfinityScrollBloc, InfinityScrollState>(
  63. builder: (context, state) {
  64. if (state is InfinityScrollFailure) {
  65. return Center(child: Text(label_error_get_data));
  66. }
  67. if (state is InfinityScrollSuccess) {
  68. if (state.items.isEmpty) {
  69. return Center(child: Text(label_list_empty));
  70. }
  71. return RefreshIndicator(
  72. child: ListView.builder(
  73. itemBuilder: (BuildContext context, int index) {
  74. return index >= state.items.length
  75. ? BottomLoader()
  76. : ItemInfinityWidget(item: state.items[index]);
  77. },
  78. itemCount: state.hasReachedMax
  79. ? state.items.length
  80. : state.items.length + 1,
  81. controller: _scrollController,
  82. ),
  83. onRefresh: () async {
  84. _infinityScrollBloc.add(OnRefresh());
  85. });
  86. }
  87. return Center(
  88. child: LoadingListPage(),
  89. );
  90. },
  91. );
  92. }
  93. @override
  94. void dispose() {
  95. _scrollController.dispose();
  96. super.dispose();
  97. }
  98. }
  99. class ItemInfinityWidget extends StatelessWidget {
  100. final Plot item;
  101. const ItemInfinityWidget({Key key, @required this.item}) : super(key: key);
  102. @override
  103. Widget build(BuildContext context) {
  104. return GestureDetector(
  105. child: Card(
  106. child: Container(
  107. padding: EdgeInsets.all(8.0),
  108. child: Column(
  109. crossAxisAlignment: CrossAxisAlignment.start,
  110. children: <Widget>[
  111. Text("Ngày giờ: " + item.activityExecuteDate.toString()),
  112. SizedBox(
  113. height: 8.0,
  114. ),
  115. Text("Thời gian: " + item.id.toString() + " giây"),
  116. ],
  117. ),
  118. ),
  119. ),
  120. onTap: () {});
  121. }
  122. }