@@ -10,6 +10,7 @@ import 'package:flutter_picgo/views/album_page/album_page_presenter.dart';
1010import 'package:permission_handler/permission_handler.dart' ;
1111import 'package:toast/toast.dart' ;
1212import 'package:flutter/services.dart' ;
13+ import 'package:pull_to_refresh/pull_to_refresh.dart' ;
1314
1415class AlbumPage extends StatefulWidget {
1516 @override
@@ -19,6 +20,11 @@ class AlbumPage extends StatefulWidget {
1920class _AlbumPageState extends State <AlbumPage > implements AlbumPageContract {
2021 AlbumPagePresenter _presenter;
2122 List <Uploaded > _uploadeds = [];
23+ RefreshController _refreshController =
24+ RefreshController (initialRefresh: false );
25+ int _perPageItemSize = 8 ;
26+ int _currentPage = 0 ;
27+ int _count = 0 ; //列表总数
2228
2329 _AlbumPageState () {
2430 _presenter = AlbumPagePresenter (this );
@@ -27,14 +33,16 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
2733 @override
2834 void initState () {
2935 super .initState ();
30- _presenter.doLoadUploadedImages ();
36+ _presenter.doGetItemCount ();
37+ _onRefresh ();
3138 }
3239
3340 @override
3441 Widget build (BuildContext context) {
3542 return Scaffold (
3643 appBar: AppBar (
37- title: Text ('相册 - ${_uploadeds ?.length ?? 0 }' ),
44+ title: Text (
45+ '相册 - ${_uploadeds ?.length ?? 0 }${_count == _uploadeds .length ? '' : " - $_count " }' ),
3846 centerTitle: true ,
3947 ),
4048 floatingActionButton: FloatingActionButton (
@@ -49,8 +57,44 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
4957 transition: TransitionType .cupertino);
5058 },
5159 ),
52- body: RefreshIndicator (
60+ body: SmartRefresher (
61+ enablePullDown: true ,
62+ enablePullUp: this ._uploadeds.length >= _perPageItemSize,
63+ header: ClassicHeader (
64+ refreshStyle: RefreshStyle .Follow ,
65+ idleText: '下拉刷新' ,
66+ releaseText: '释放刷新' ,
67+ completeText: '加载完成' ,
68+ refreshingText: '刷新中' ,
69+ failedText: '加载失败,请重试' ,
70+ ),
71+ footer: CustomFooter (
72+ builder: (BuildContext context, LoadStatus mode) {
73+ Widget body;
74+ if (mode == LoadStatus .idle) {
75+ body = Text ("上拉加载" );
76+ } else if (mode == LoadStatus .loading) {
77+ body = SizedBox (
78+ width: 15 ,
79+ height: 15 ,
80+ child: CircularProgressIndicator (),
81+ );
82+ } else if (mode == LoadStatus .failed) {
83+ body = Text ("加载失败!点击重试!" );
84+ } else if (mode == LoadStatus .canLoading) {
85+ body = Text ("松手,加载更多!" );
86+ } else {
87+ body = Text ("没有更多数据了!" );
88+ }
89+ return Container (
90+ height: 55.0 ,
91+ child: Center (child: body),
92+ );
93+ },
94+ ),
5395 onRefresh: _onRefresh,
96+ onLoading: _onLoading,
97+ controller: _refreshController,
5498 child: _uploadeds.length > 0 ? albumView () : emptyView ()),
5599 );
56100 }
@@ -142,35 +186,44 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
142186 }
143187
144188 Widget emptyView () {
145- return ListView (
146- children : < Widget > [
147- SizedBox (height : 100 ) ,
148- Center (
149- child : Container (
189+ return Center (
190+ child : Column (
191+ mainAxisAlignment : MainAxisAlignment .center ,
192+ children : < Widget > [
193+ Container (
150194 width: 200 ,
151195 height: 200 ,
152196 child: Image .asset ('assets/images/icon_empty_album.png' ,
153197 fit: BoxFit .fill),
154198 ),
155- ),
156- SizedBox (height: 10 ),
157- Center (
158- child: Text (
159- '相册暂无任何照片,快点击右下角按钮去上传吧' ,
160- style: TextStyle (color: Colors .grey),
161- ),
162- )
163- ],
199+ Center (
200+ child: Text (
201+ '相册暂无任何照片,快点击右下角按钮去上传吧' ,
202+ style: TextStyle (color: Colors .grey),
203+ ),
204+ )
205+ ],
206+ ),
164207 );
165208 }
166209
167- Future <dynamic > _onRefresh () async {
210+ /// 刷新
211+ _onRefresh () async {
212+ // _uploadeds.clear();
168213 setState (() {
169- _uploadeds.clear ();
214+ this ._currentPage = 0 ;
215+ this ._uploadeds.clear ();
216+ _refreshController.resetNoData ();
170217 });
171- return _presenter.doLoadUploadedImages ();
218+ _presenter.doLoadUploadedImages (_perPageItemSize, this ._currentPage );
172219 }
173220
221+ /// 上拉加载
222+ _onLoading () async {
223+ _presenter.doLoadUploadedImages (_perPageItemSize, _currentPage += 1 );
224+ }
225+
226+ /// 处理图片点击
174227 handleTap (int index) {
175228 Clipboard .setData (ClipboardData (text: _uploadeds[index].path));
176229 Toast .show ('已复制到剪切板' , context);
@@ -179,13 +232,29 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
179232 @override
180233 void loadUploadedImages (List <Uploaded > uploadeds) {
181234 setState (() {
182- this ._uploadeds.addAll (uploadeds);
235+ if (this ._currentPage == 0 ) {
236+ _refreshController.refreshCompleted ();
237+ } else if (this ._currentPage > 0 &&
238+ (uploadeds == null || uploadeds.length == 0 )) {
239+ _refreshController.loadNoData ();
240+ } else {
241+ this ._currentPage += 1 ;
242+ _refreshController.loadComplete ();
243+ }
244+ if (uploadeds != null && uploadeds.length > 0 ) {
245+ this ._uploadeds.addAll (uploadeds);
246+ }
183247 });
184248 }
185249
186250 @override
187251 void loadError () {
188252 Toast .show ('加载失败' , context);
253+ if (this ._currentPage == 1 ) {
254+ _refreshController.refreshFailed ();
255+ } else {
256+ _refreshController.loadFailed ();
257+ }
189258 }
190259
191260 @override
@@ -199,4 +268,11 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
199268 this ._uploadeds.remove (uploaded);
200269 });
201270 }
271+
272+ @override
273+ void loadItemCount (int count) {
274+ setState (() {
275+ this ._count = count;
276+ });
277+ }
202278}
0 commit comments