LoadMore.dart 2.0KB

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