Kaynağa Gözat

add loadmore widget

张延森 3 yıl önce
ebeveyn
işleme
20b33e7004
1 değiştirilmiş dosya ile 81 ekleme ve 0 silme
  1. 81
    0
      lib/widgets/LoadMore.dart

+ 81
- 0
lib/widgets/LoadMore.dart Dosyayı Görüntüle

@@ -0,0 +1,81 @@
1
+
2
+import 'package:flutter/widgets.dart';
3
+
4
+import 'package:farmer_client/models/entities/PagedResult.dart';
5
+
6
+class LoadMore extends StatefulWidget {
7
+  LoadMore({
8
+    Key? key,
9
+    required this.builder,
10
+    required this.fetch,
11
+    this.onError,
12
+  }): super(key: key);
13
+
14
+  Future Function(Map param) fetch;
15
+  Function? onError;
16
+
17
+  Widget Function({
18
+    BuildContext context,
19
+    ScrollController scrollController,
20
+    PagedResult data,
21
+    bool haveMore,
22
+  }) builder;
23
+
24
+  @override
25
+  State<StatefulWidget> createState () => _LoadMoreState();
26
+}
27
+
28
+class _LoadMoreState extends State<LoadMore> {
29
+  final _controller = ScrollController();
30
+  // 是否还有更多
31
+  bool haveMore = true;
32
+
33
+  PagedResult result = PagedResult(total: 0, size: 0, pages: 0, current: 0);
34
+  List<dynamic> listData = [];
35
+
36
+  @override
37
+  initState() {
38
+    super.initState();
39
+
40
+    // 添加滚动监听
41
+    _controller.addListener(() {
42
+      //当滚动到最底部的时候,加载新的数据
43
+      if (_controller.position.pixels == _controller.position.maxScrollExtent) {
44
+        //当还有更多数据的时候才会进行加载新数据
45
+        if (haveMore) {
46
+          fetchData();
47
+        }
48
+      }
49
+    });
50
+
51
+    fetchData();
52
+  }
53
+
54
+  Future fetchData() {
55
+    final pageNum = result.current + 1;
56
+    final pageSize = result.size == 0 ? 10 : result.size;
57
+    Map params = { "pageNum": pageNum, "pageSize": pageSize };
58
+    return Future.value(widget.fetch(params).then((res) {
59
+      setState(() {
60
+        result = PagedResult.fromJson(res);
61
+        // 如果当前页小于总页数
62
+        haveMore = result.current < result.pages;
63
+      });
64
+    }).catchError((err) {
65
+      print(err);
66
+      if (null != widget.onError) {
67
+        widget.onError!(err);
68
+      }
69
+    }));
70
+  }
71
+
72
+  @override
73
+  Widget build(BuildContext context) {
74
+    return widget.builder(
75
+      context: context,
76
+      scrollController: _controller,
77
+      data: result,
78
+      haveMore: haveMore,
79
+    );
80
+  }
81
+}