Refresher.dart 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import 'package:farmer_client/models/entities/PagedResult.dart';
  2. import 'package:flutter/material.dart';
  3. class RefreshBuilder extends StatefulWidget {
  4. RefreshBuilder({
  5. Key? key,
  6. this.autoRerender = true,
  7. required this.builder,
  8. required this.fetch,
  9. required this.useState,
  10. this.onError,
  11. }) : super(key: key);
  12. bool autoRerender;
  13. Future Function(Map param) fetch;
  14. Function({PagedResult state}) useState;
  15. Function? onError;
  16. Widget Function({
  17. BuildContext context,
  18. Function toggle,
  19. }) builder;
  20. @override
  21. State<StatefulWidget> createState() => _RefresherState();
  22. }
  23. class _RefresherState extends State<RefreshBuilder> {
  24. PagedResult result = PagedResult(total: 0, size: 0, pages: 0, current: 0);
  25. List<dynamic> listData = [];
  26. @override
  27. initState() {
  28. super.initState();
  29. fetchData();
  30. }
  31. Future fetchData() {
  32. return Future.value(widget.fetch({"pageNum": 1}).then((res) {
  33. final pagedResult = PagedResult.fromJson(res);
  34. widget.useState(state: pagedResult);
  35. if (widget.autoRerender) {
  36. setState(() {});
  37. }
  38. }).catchError((err) {
  39. print(err);
  40. if (null != widget.onError) {
  41. widget.onError!(err);
  42. }
  43. }));
  44. }
  45. toggle() {
  46. fetchData();
  47. }
  48. @override
  49. Widget build(BuildContext context) {
  50. return RefreshIndicator(
  51. triggerMode: RefreshIndicatorTriggerMode.onEdge,
  52. onRefresh: fetchData,
  53. child: widget.builder(context: context, toggle: toggle),
  54. );
  55. }
  56. }