From c0e5879b0b48213ae2a23a065c8622acb3c7aeeb Mon Sep 17 00:00:00 2001
From: ramon <fqmlemon@sina.com>
Date: Thu, 23 Feb 2023 23:29:51 +0800
Subject: [PATCH] =?UTF-8?q?feature:=20=E5=AE=8C=E6=88=90=E5=AE=9A=E5=88=B6?=
 =?UTF-8?q?=E4=BA=A7=E5=93=81=E4=BA=A7=E5=93=81=E5=88=97=E8=A1=A8=E9=A1=B5?=
 =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .vscode/launch.json                           |  6 ++
 lib/Customization/Customization.dart          | 62 ++++++++++++++++---
 .../ViewModel/ProductListViewModel.dart       | 31 ++++++++--
 lib/main.dart                                 |  4 ++
 pubspec.lock                                  |  8 +++
 pubspec.yaml                                  |  1 +
 6 files changed, 99 insertions(+), 13 deletions(-)

diff --git a/.vscode/launch.json b/.vscode/launch.json
index b531d71..5b18ec5 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -16,6 +16,12 @@
             "type": "dart",
             "deviceId": "1DA4CCCC-D0B8-47DF-B671-FAC9B80F7030"
         },
+        {
+            "name": "Ramon Mac(iOS模拟器)",
+            "request": "launch",
+            "type": "dart",
+            "deviceId": "B7195A0C-A207-403A-AEF5-ACD3D72C22B6"
+        },
         {
             "name": "my_app2 (profile mode)",
             "request": "launch",
diff --git a/lib/Customization/Customization.dart b/lib/Customization/Customization.dart
index 7b4a1da..cdb80f6 100644
--- a/lib/Customization/Customization.dart
+++ b/lib/Customization/Customization.dart
@@ -1,6 +1,8 @@
 import 'dart:math' as math;
 
+import 'package:easy_refresh/easy_refresh.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
 import 'package:my_app2/Assets/AssetImages.dart';
 import 'package:my_app2/Customization/ViewModel/ProductListViewModel.dart';
 import 'package:my_app2/Models/ProductModel.dart';
@@ -37,21 +39,37 @@ class _CustomizationListImg extends StatefulWidget {
 }
 
 class _CustomizationListImgState extends State<_CustomizationListImg> {
+  late EasyRefreshController _refreshController;
   @override
   void initState() {
     super.initState();
-    widget.viewModel.pullUp();
+    _refreshController = widget.viewModel.refreshController;
+    // widget.viewModel.pullUp();
+  }
+
+  @override
+  void dispose() {
+    _refreshController.dispose();
+    super.dispose();
+  }
+
+  void _onRefresh() {
+    widget.viewModel.refresh();
+  }
+
+  void _onLoad() {
+    widget.viewModel.loadMore();
   }
 
   @override
   Widget build(BuildContext context) {
     return Consumer<ProductListViewModel>(
       builder: (context, viewModel, child) {
-        if (viewModel.isLoading) {
-          return const Center(
-            child: CircularProgressIndicator(),
-          );
-        }
+        // if (viewModel.isLoading) {
+        //   return const Center(
+        //     child: CircularProgressIndicator(),
+        //   );
+        // }
 
         List<Widget> slivers = [];
         if (viewModel.photoProductList.isNotEmpty &&
@@ -105,7 +123,37 @@ class _CustomizationListImgState extends State<_CustomizationListImg> {
             ),
           ];
         }
-        return CustomScrollView(slivers: slivers);
+        // return CustomScrollView(slivers: slivers);
+        final themeData = Theme.of(context);
+        return EasyRefresh(
+          controller: _refreshController,
+          refreshOnStart: true,
+          refreshOnStartHeader: BuilderHeader(
+            triggerOffset: 70,
+            clamping: true,
+            position: IndicatorPosition.above,
+            processedDuration: Duration.zero,
+            builder: (context, state) {
+              if (state.mode == IndicatorMode.inactive ||
+                  state.mode == IndicatorMode.done) {
+                return const SizedBox();
+              }
+              return Container(
+                padding: const EdgeInsets.only(bottom: 100),
+                width: double.infinity,
+                height: state.viewportDimension,
+                alignment: Alignment.center,
+                child: SpinKitDoubleBounce(
+                  size: 32,
+                  color: themeData.colorScheme.primary,
+                ),
+              );
+            },
+          ),
+          onRefresh: _onRefresh,
+          onLoad: _onLoad,
+          child: CustomScrollView(slivers: slivers),
+        );
       },
     );
   }
diff --git a/lib/Customization/ViewModel/ProductListViewModel.dart b/lib/Customization/ViewModel/ProductListViewModel.dart
index 1a89878..2f54bba 100644
--- a/lib/Customization/ViewModel/ProductListViewModel.dart
+++ b/lib/Customization/ViewModel/ProductListViewModel.dart
@@ -1,9 +1,13 @@
+import 'package:easy_refresh/easy_refresh.dart';
 import 'package:flutter/material.dart';
 import 'package:my_app2/Models/ProductModel.dart';
 import 'package:my_app2/Network/api/product_api.dart';
 import 'package:my_app2/Network/http/BaseApi.dart';
 
 class ProductListViewModel extends ChangeNotifier {
+  final EasyRefreshController refreshController = EasyRefreshController(
+      controlFinishRefresh: true, controlFinishLoad: true);
+
   final List<ProductModel> _productList = [];
 
   int _page = 1;
@@ -48,18 +52,33 @@ class ProductListViewModel extends ChangeNotifier {
     return _productList.sublist(index);
   }
 
-  void pullUp() {
+  void refresh() {
     var api = ProductListApi(page: 1, pageSize: _pageSize);
     api.request(
       onSuccessed: (value) {
-        if (value == null) {
-          return;
-        }
-        _updateProductList(value, true);
+        var list = value ?? [];
+        _page = 1;
+        refreshController.finishRefresh();
+        refreshController.resetFooter;
+        _updateProductList(list, true);
       },
       onFailed: (p0) {},
     );
   }
 
-  void loadMore() {}
+  void loadMore() {
+    var api = ProductListApi(page: _page + 1, pageSize: _pageSize);
+    api.request(
+      onSuccessed: (value) {
+        var list = value ?? [];
+        _page += 1;
+
+        refreshController.finishLoad(list.length >= _pageSize
+            ? IndicatorResult.success
+            : IndicatorResult.noMore);
+        _updateProductList(list, false);
+      },
+      onFailed: (p0) {},
+    );
+  }
 }
diff --git a/lib/main.dart b/lib/main.dart
index 9f4de92..e29667c 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -40,6 +40,10 @@ class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return MaterialApp.router(
+      theme: ThemeData(
+          brightness: Brightness.light,
+          colorSchemeSeed: const Color(0xFFFFAA22),
+          useMaterial3: true),
       routerConfig: _router,
     );
   }
diff --git a/pubspec.lock b/pubspec.lock
index c35feca..ba0e71b 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -238,6 +238,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.1"
+  flutter_spinkit:
+    dependency: "direct main"
+    description:
+      name: flutter_spinkit
+      sha256: "77a2117c0517ff909221f3160b8eb20052ab5216107581168af574ac1f05dff8"
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.1.0"
   flutter_swiper_view:
     dependency: "direct main"
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index f94d76d..a29bf60 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -42,6 +42,7 @@ dependencies:
   dio: ^5.0.0
   provider: ^6.0.5
   easy_refresh: ^3.3.1
+  flutter_spinkit: ^5.1.0
 
 dev_dependencies:
   flutter_test:
-- 
2.21.0