pull_to_refresh.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import 'package:flutter/widgets.dart';
  2. import 'package:pull_to_refresh/pull_to_refresh.dart';
  3. class PullToRefresh extends StatelessWidget {
  4. /// 刷新加载包装的内容体
  5. final Widget child;
  6. final Widget? header;
  7. final Widget? footer;
  8. /// 刷新加载状态控制器
  9. final PullToRefreshController controller;
  10. /// 是否支持下拉刷新
  11. final bool enableRefresh;
  12. /// 是否支持上拉加载
  13. final bool enableLoadMore;
  14. /// 刷新回调
  15. final VoidCallback? onRefresh;
  16. /// 加载更多回调
  17. final VoidCallback? onLoadMore;
  18. const PullToRefresh({
  19. super.key,
  20. required this.controller,
  21. required this.child,
  22. this.header,
  23. this.footer,
  24. this.enableRefresh = false,
  25. this.enableLoadMore = false,
  26. this.onRefresh,
  27. this.onLoadMore,
  28. });
  29. @override
  30. Widget build(BuildContext context) {
  31. VoidCallback refreshCallback = onRefresh ??
  32. () => {
  33. // 默认1s之后重置刷新
  34. Future.delayed(const Duration(milliseconds: 1000), () {
  35. controller.refreshCompleted();
  36. })
  37. };
  38. VoidCallback loadMoreCallback = onLoadMore ??
  39. () => {
  40. // 默认1s之后结束加载更多
  41. Future.delayed(const Duration(milliseconds: 1000), () {
  42. controller.loadMoreComplete();
  43. })
  44. };
  45. return SmartRefresher(
  46. controller: controller._refreshController,
  47. enablePullDown: enableRefresh,
  48. enablePullUp: enableLoadMore,
  49. header: header,
  50. footer: footer,
  51. onRefresh: refreshCallback,
  52. onLoading: loadMoreCallback,
  53. child: child,
  54. );
  55. }
  56. }
  57. class PullToRefreshController {
  58. RefreshController? _rController;
  59. RefreshController get _refreshController {
  60. _rController ??= RefreshController(initialRefresh: false);
  61. return _rController!;
  62. }
  63. /// 请求刷新
  64. void requestRefresh() {
  65. _refreshController.requestRefresh();
  66. }
  67. /// 完成刷新
  68. void refreshCompleted() {
  69. _refreshController.refreshCompleted(resetFooterState: true);
  70. }
  71. /// 加载更多完成
  72. void loadMoreComplete({bool success = true}) {
  73. success
  74. ? _refreshController.loadComplete()
  75. : _refreshController.loadFailed();
  76. }
  77. /// 加载更多完成并没有更多数据
  78. void loadMoreCompleteWithNoData() {
  79. _refreshController.loadNoData();
  80. }
  81. /// 重置加载更多
  82. void resetLoadMoreData() {
  83. _refreshController.resetNoData();
  84. }
  85. /// 是否正在刷新
  86. bool get isRefresh => _refreshController.isRefresh;
  87. /// 是否正在加载
  88. bool get isLoading => _refreshController.isLoading;
  89. }