Skip to content

Commit 434152c

Browse files
committed
feature:complete paging Load
1 parent b91692e commit 434152c

File tree

3 files changed

+118
-25
lines changed

3 files changed

+118
-25
lines changed

lib/utils/sql.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@ class Sql extends BaseModel {
1111
return await this.query(tableName);
1212
}
1313

14-
Future<List> getBySql(String where, List<dynamic> whereArgs) async {
15-
return await this.query(tableName, where: where, whereArgs: whereArgs);
14+
Future<List> getBySql(String where, List<dynamic> whereArgs,
15+
{String orderBy, int limit, int offset}) async {
16+
return await this.query(tableName,
17+
where: where,
18+
whereArgs: whereArgs,
19+
orderBy: orderBy,
20+
limit: limit,
21+
offset: offset);
1622
}
1723

1824
Future<int> rawUpdate(String sql, [List<dynamic> arguments]) async {

lib/views/album_page/album_page.dart

Lines changed: 97 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:flutter_picgo/views/album_page/album_page_presenter.dart';
1010
import 'package:permission_handler/permission_handler.dart';
1111
import 'package:toast/toast.dart';
1212
import 'package:flutter/services.dart';
13+
import 'package:pull_to_refresh/pull_to_refresh.dart';
1314

1415
class AlbumPage extends StatefulWidget {
1516
@override
@@ -19,6 +20,11 @@ class AlbumPage extends StatefulWidget {
1920
class _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
}

lib/views/album_page/album_page_presenter.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ abstract class AlbumPageContract {
88
void loadUploadedImages(List<Uploaded> uploadeds);
99
void loadError();
1010

11+
void loadItemCount(int count);
12+
1113
void deleteSuccess(Uploaded uploaded);
1214
void deleteError(String msg);
1315
}
@@ -17,10 +19,11 @@ class AlbumPagePresenter {
1719

1820
AlbumPagePresenter(this._view);
1921

20-
doLoadUploadedImages() async {
22+
doLoadUploadedImages(int limit, int offest) async {
2123
try {
2224
var sql = Sql.setTable(TABLE_NAME_UPLOADED);
23-
var result = await sql.get();
25+
var result = await sql.getBySql(null, null,
26+
limit: limit, offset: offest * limit, orderBy: 'id DESC');
2427
List<Uploaded> uploadeds = result.map((v) {
2528
return Uploaded.fromMap(v);
2629
}).toList();
@@ -31,6 +34,14 @@ class AlbumPagePresenter {
3134
}
3235
}
3336

37+
doGetItemCount() async {
38+
try {
39+
var sql = Sql.setTable(TABLE_NAME_UPLOADED);
40+
var result = await sql.get();
41+
_view.loadItemCount(result.length ?? 0);
42+
} catch (e) {}
43+
}
44+
3445
doDeleteImage(Uploaded uploaded) async {
3546
try {
3647
ImageUploadUtils uploader = ImageUploadUtils(

0 commit comments

Comments
 (0)