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