Browse Source

[new]增加上下拉刷新库

zk 1 year ago
parent
commit
e22e2afc21
3 changed files with 131 additions and 15 deletions
  1. 20 14
      lib/main.dart
  2. 109 0
      lib/widget/pull_to_refresh.dart
  3. 2 1
      pubspec.yaml

+ 20 - 14
lib/main.dart

@@ -1,3 +1,4 @@
+import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string_source.dart';
 import 'package:electronic_assistant/resource/string_source.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/app_info_util.dart';
 import 'package:electronic_assistant/utils/app_info_util.dart';
@@ -7,6 +8,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 import 'package:get/get_navigation/src/root/get_material_app.dart';
 import 'package:get/get_navigation/src/root/get_material_app.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
 
 
 void main() async {
 void main() async {
   WidgetsFlutterBinding.ensureInitialized();
   WidgetsFlutterBinding.ensureInitialized();
@@ -34,21 +36,25 @@ class MyApp extends StatelessWidget {
   }
   }
 
 
   _buildMaterialApp() {
   _buildMaterialApp() {
-    return GetMaterialApp(
-      title: 'Flutter Demo',
-      getPages: AppPage.pages,
-      initialRoute: RoutePath.splash,
-      initialBinding: AppBinding(),
-      theme: ThemeData(
-        useMaterial3: true,
+    return RefreshConfiguration(
+      headerBuilder: () =>
+          const MaterialClassicHeader(color: ColorName.colorPrimary),
+      child: GetMaterialApp(
+        title: 'Flutter Demo',
+        getPages: AppPage.pages,
+        initialRoute: RoutePath.splash,
+        initialBinding: AppBinding(),
+        theme: ThemeData(
+          useMaterial3: true,
+        ),
+        navigatorObservers: [FlutterSmartDialog.observer],
+        builder: FlutterSmartDialog.init(),
+        translations: StringResource(),
+        // 你的翻译
+        locale: const Locale('zh', 'CN'),
+        // 将会按照此处指定的语言翻译
+        fallbackLocale: const Locale('zh', 'CN'), // 添加一个回调语言选项,以备上面指定的语言翻译不存在
       ),
       ),
-      navigatorObservers: [FlutterSmartDialog.observer],
-      builder: FlutterSmartDialog.init(),
-      translations: StringResource(),
-      // 你的翻译
-      locale: const Locale('zh', 'CN'),
-      // 将会按照此处指定的语言翻译
-      fallbackLocale: const Locale('zh', 'CN'), // 添加一个回调语言选项,以备上面指定的语言翻译不存在
     );
     );
   }
   }
 }
 }

+ 109 - 0
lib/widget/pull_to_refresh.dart

@@ -0,0 +1,109 @@
+import 'package:flutter/widgets.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+
+class PullToRefresh extends StatelessWidget {
+  /// 刷新加载包装的内容体
+  final Widget child;
+
+  final Widget? header;
+
+  final Widget? footer;
+
+  /// 刷新加载状态控制器
+  final PullToRefreshController controller;
+
+  /// 是否支持下拉刷新
+  final bool enableRefresh;
+
+  /// 是否支持上拉加载
+  final bool enableLoadMore;
+
+  /// 刷新回调
+  final VoidCallback? onRefresh;
+
+  /// 加载更多回调
+  final VoidCallback? onLoadMore;
+
+  const PullToRefresh({
+    super.key,
+    required this.controller,
+    required this.child,
+    this.header,
+    this.footer,
+    this.enableRefresh = false,
+    this.enableLoadMore = false,
+    this.onRefresh,
+    this.onLoadMore,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    VoidCallback refreshCallback = onRefresh ??
+        () => {
+              // 默认1s之后重置刷新
+              Future.delayed(const Duration(milliseconds: 1000), () {
+                controller.refreshCompleted();
+              })
+            };
+    VoidCallback loadMoreCallback = onLoadMore ??
+        () => {
+              // 默认1s之后结束加载更多
+              Future.delayed(const Duration(milliseconds: 1000), () {
+                controller.loadMoreComplete();
+              })
+            };
+
+    return SmartRefresher(
+      controller: controller._refreshController,
+      enablePullDown: enableRefresh,
+      enablePullUp: enableLoadMore,
+      header: header,
+      footer: footer,
+      onRefresh: refreshCallback,
+      onLoading: loadMoreCallback,
+      child: child,
+    );
+  }
+}
+
+class PullToRefreshController {
+  RefreshController? _rController;
+
+  RefreshController get _refreshController {
+    _rController ??= RefreshController(initialRefresh: false);
+    return _rController!;
+  }
+
+  /// 请求刷新
+  void requestRefresh() {
+    _refreshController.requestRefresh();
+  }
+
+  /// 完成刷新
+  void refreshCompleted() {
+    _refreshController.refreshCompleted(resetFooterState: true);
+  }
+
+  /// 加载更多完成
+  void loadMoreComplete({bool success = true}) {
+    success
+        ? _refreshController.loadComplete()
+        : _refreshController.loadFailed();
+  }
+
+  /// 加载更多完成并没有更多数据
+  void loadMoreCompleteWithNoData() {
+    _refreshController.loadNoData();
+  }
+
+  /// 重置加载更多
+  void resetLoadMoreData() {
+    _refreshController.resetNoData();
+  }
+
+  /// 是否正在刷新
+  bool get isRefresh => _refreshController.isRefresh;
+
+  /// 是否正在加载
+  bool get isLoading => _refreshController.isLoading;
+}

+ 2 - 1
pubspec.yaml

@@ -54,7 +54,8 @@ dependencies:
   #tencent mmkv
   #tencent mmkv
   mmkv: ^1.3.9
   mmkv: ^1.3.9
 
 
-
+  #上、下拉刷新
+  pull_to_refresh: ^2.0.0
 
 
 
 
 dev_dependencies:
 dev_dependencies: