Skip to content

Commit 93d3c3a

Browse files
authored
Merge pull request #6 from PicGo/dev
merge dev
2 parents d951e1a + d4d8b36 commit 93d3c3a

File tree

8 files changed

+176
-31
lines changed

8 files changed

+176
-31
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313

1414
Flutter-PicGo: 一个用于快速上传图片并获取图片URL链接的**手机版**工具
1515

16-
Flutter-PicGo 本体支持如下图床:
16+
**Flutter-PicGo 本体支持如下图床:**
1717

1818
- GitHub [v1.0+]
1919
- SM.MS [v1.1+]
2020
- Gitee [v1.2+]
2121
- 七牛云 [v1.3+]
2222
- 阿里云OSS [v1.4+]
23+
- 腾讯云COS [v1.5+]
2324

2425
> 开发进度可以查看 [Projects](https://github.com/PicGo/flutter-picgo/projects),会同步更新开发进度
2526
@@ -30,6 +31,9 @@ Flutter-PicGo 本体支持如下图床:
3031
- 适配深色模式,可跟随系统或手动设置
3132
- 支持将flutter-picgo的配置导出至剪切板
3233

34+
> 基本使用配置与PicGo无异,可参考[配置文档](https://picgo.github.io/PicGo-Doc/zh/guide/config.html#%E5%9B%BE%E5%BA%8A%E5%8C%BA)
35+
> 腾讯云COS仅支持v5版配置
36+
3337
# 应用截图
3438

3539
![](https://github.static.si-yee.com/image_picker_82452E23-BE11-4712-BFBA-8E93038DB410-3851-00000340B21CCF62.png)

docs/version.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"iOS": {
3-
"versionName": "1.4.0",
4-
"versionCode": "8"
3+
"versionName": "1.5.1",
4+
"versionCode": "11"
55
},
66
"Android": {
7-
"versionName": "1.4.1",
8-
"versionCode": "9"
7+
"versionName": "1.5.1",
8+
"versionCode": "11"
99
}
1010
}

lib/api/picgo_api.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:flutter_picgo/utils/net.dart';
3+
4+
class PicgoApi {
5+
/// 获取App最新版本
6+
static Future getLatestVersion() async {
7+
Response res = await NetUtils.getInstance().get(
8+
'https://cdn.jsdelivr.net/gh/PicGo/flutter-picgo@dev/docs/version.json');
9+
return res;
10+
}
11+
}

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: 86 additions & 20 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,10 @@ 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;
2227

2328
_AlbumPageState() {
2429
_presenter = AlbumPagePresenter(this);
@@ -27,7 +32,7 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
2732
@override
2833
void initState() {
2934
super.initState();
30-
_presenter.doLoadUploadedImages();
35+
_onRefresh();
3136
}
3237

3338
@override
@@ -49,8 +54,44 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
4954
transition: TransitionType.cupertino);
5055
},
5156
),
52-
body: RefreshIndicator(
57+
body: SmartRefresher(
58+
enablePullDown: true,
59+
enablePullUp: this._uploadeds.length >= _perPageItemSize,
60+
header: ClassicHeader(
61+
refreshStyle: RefreshStyle.Follow,
62+
idleText: '下拉刷新',
63+
releaseText: '释放刷新',
64+
completeText: '加载完成',
65+
refreshingText: '刷新中',
66+
failedText: '加载失败,请重试',
67+
),
68+
footer: CustomFooter(
69+
builder: (BuildContext context, LoadStatus mode) {
70+
Widget body;
71+
if (mode == LoadStatus.idle) {
72+
body = Text("上拉加载");
73+
} else if (mode == LoadStatus.loading) {
74+
body = SizedBox(
75+
width: 15,
76+
height: 15,
77+
child: CircularProgressIndicator(),
78+
);
79+
} else if (mode == LoadStatus.failed) {
80+
body = Text("加载失败!点击重试!");
81+
} else if (mode == LoadStatus.canLoading) {
82+
body = Text("松手,加载更多!");
83+
} else {
84+
body = Text("没有更多数据了!");
85+
}
86+
return Container(
87+
height: 55.0,
88+
child: Center(child: body),
89+
);
90+
},
91+
),
5392
onRefresh: _onRefresh,
93+
onLoading: _onLoading,
94+
controller: _refreshController,
5495
child: _uploadeds.length > 0 ? albumView() : emptyView()),
5596
);
5697
}
@@ -142,35 +183,44 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
142183
}
143184

144185
Widget emptyView() {
145-
return ListView(
146-
children: <Widget>[
147-
SizedBox(height: 100),
148-
Center(
149-
child: Container(
186+
return Center(
187+
child: Column(
188+
mainAxisAlignment: MainAxisAlignment.center,
189+
children: <Widget>[
190+
Container(
150191
width: 200,
151192
height: 200,
152193
child: Image.asset('assets/images/icon_empty_album.png',
153194
fit: BoxFit.fill),
154195
),
155-
),
156-
SizedBox(height: 10),
157-
Center(
158-
child: Text(
159-
'相册暂无任何照片,快点击右下角按钮去上传吧',
160-
style: TextStyle(color: Colors.grey),
161-
),
162-
)
163-
],
196+
Center(
197+
child: Text(
198+
'相册暂无任何照片,快点击右下角按钮去上传吧',
199+
style: TextStyle(color: Colors.grey),
200+
),
201+
)
202+
],
203+
),
164204
);
165205
}
166206

167-
Future<dynamic> _onRefresh() async {
207+
/// 刷新
208+
_onRefresh() async {
209+
// _uploadeds.clear();
168210
setState(() {
169-
_uploadeds.clear();
211+
this._currentPage = 0;
212+
this._uploadeds.clear();
213+
_refreshController.resetNoData();
170214
});
171-
return _presenter.doLoadUploadedImages();
215+
_presenter.doLoadUploadedImages(_perPageItemSize, this._currentPage);
216+
}
217+
218+
/// 上拉加载
219+
_onLoading() async {
220+
_presenter.doLoadUploadedImages(_perPageItemSize, _currentPage += 1);
172221
}
173222

223+
/// 处理图片点击
174224
handleTap(int index) {
175225
Clipboard.setData(ClipboardData(text: _uploadeds[index].path));
176226
Toast.show('已复制到剪切板', context);
@@ -179,13 +229,29 @@ class _AlbumPageState extends State<AlbumPage> implements AlbumPageContract {
179229
@override
180230
void loadUploadedImages(List<Uploaded> uploadeds) {
181231
setState(() {
182-
this._uploadeds.addAll(uploadeds);
232+
if (this._currentPage == 0) {
233+
_refreshController.refreshCompleted();
234+
} else if (this._currentPage > 0 &&
235+
(uploadeds == null || uploadeds.length == 0)) {
236+
_refreshController.loadNoData();
237+
} else {
238+
this._currentPage += 1;
239+
_refreshController.loadComplete();
240+
}
241+
if (uploadeds != null && uploadeds.length > 0) {
242+
this._uploadeds.addAll(uploadeds);
243+
}
183244
});
184245
}
185246

186247
@override
187248
void loadError() {
188249
Toast.show('加载失败', context);
250+
if (this._currentPage == 1) {
251+
_refreshController.refreshFailed();
252+
} else {
253+
_refreshController.loadFailed();
254+
}
189255
}
190256

191257
@override

lib/views/album_page/album_page_presenter.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ class AlbumPagePresenter {
1717

1818
AlbumPagePresenter(this._view);
1919

20-
doLoadUploadedImages() async {
20+
doLoadUploadedImages(int limit, int offest) async {
2121
try {
2222
var sql = Sql.setTable(TABLE_NAME_UPLOADED);
23-
var result = await sql.get();
23+
var result = await sql.getBySql(null, null,
24+
limit: limit, offset: offest * limit, orderBy: 'id DESC');
2425
List<Uploaded> uploadeds = result.map((v) {
2526
return Uploaded.fromMap(v);
2627
}).toList();

lib/views/picgo_setting_page/picgo_setting_page.dart

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1+
import 'dart:io';
2+
3+
import 'package:dio/dio.dart';
14
import 'package:fluro/fluro.dart';
25
import 'package:flutter/material.dart';
36
import 'package:flutter/cupertino.dart';
7+
import 'package:flutter_picgo/api/picgo_api.dart';
48
import 'package:flutter_picgo/routers/application.dart';
59
import 'package:flutter_picgo/routers/routers.dart';
610
import 'package:flutter_picgo/utils/local_notification.dart';
711
import 'package:flutter_picgo/utils/shared_preferences.dart';
12+
import 'package:package_info/package_info.dart';
813
import 'package:toast/toast.dart';
14+
import 'package:url_launcher/url_launcher.dart';
915

1016
class PicGoSettingPage extends StatefulWidget {
1117
@override
@@ -17,6 +23,7 @@ class _PicGoSettingPageState extends State<PicGoSettingPage> {
1723
bool isTimestampRename = false;
1824
bool isUploadedTip = false;
1925
bool isForceDelete = false;
26+
bool isNeedUpdate = false;
2027

2128
@override
2229
void initState() {
@@ -33,6 +40,8 @@ class _PicGoSettingPageState extends State<PicGoSettingPage> {
3340
u?.getBool(SharedPreferencesKeys.settingIsForceDelete) ?? false;
3441
});
3542
});
43+
// update
44+
_getLatestVersion();
3645
}
3746

3847
@override
@@ -117,7 +126,20 @@ class _PicGoSettingPageState extends State<PicGoSettingPage> {
117126
// ),
118127
ListTile(
119128
title: Text('检查更新'),
120-
onTap: () {},
129+
onTap: () {
130+
_handleUpdateTap();
131+
},
132+
trailing: CircleAvatar(
133+
backgroundColor: Colors.transparent,
134+
child: Container(
135+
width: 8,
136+
height: 8,
137+
// color: Colors.red,
138+
decoration: BoxDecoration(
139+
color: isNeedUpdate ? Colors.red : Colors.transparent,
140+
borderRadius: BorderRadius.circular(4)),
141+
),
142+
),
121143
),
122144
],
123145
);
@@ -131,4 +153,38 @@ class _PicGoSettingPageState extends State<PicGoSettingPage> {
131153
instance.putBool(key, value);
132154
Toast.show('保存成功', context);
133155
}
156+
157+
_getLatestVersion() async {
158+
try {
159+
Response res = await PicgoApi.getLatestVersion();
160+
PackageInfo info = await PackageInfo.fromPlatform();
161+
int version = int.parse(info.buildNumber);
162+
debugPrint('$version');
163+
int remoteVersion = 0;
164+
if (Platform.isAndroid) {
165+
remoteVersion = int.parse('${res.data["Android"]["versionCode"]}');
166+
} else if (Platform.isIOS) {
167+
remoteVersion = int.parse('${res.data["iOS"]["versionCode"]}');
168+
}
169+
if (version < remoteVersion) {
170+
setState(() {
171+
this.isNeedUpdate = true;
172+
});
173+
}
174+
} catch (e) {
175+
print(e);
176+
}
177+
}
178+
179+
_handleUpdateTap() async {
180+
if (isNeedUpdate) {
181+
if (Platform.isAndroid) {
182+
launch('https://www.pgyer.com/flutter-picgo');
183+
} else if (Platform.isIOS) {
184+
launch('https://apps.apple.com/cn/app/flutter-picgo/id1519714305');
185+
}
186+
} else {
187+
Toast.show('当前已经是最新版本', context);
188+
}
189+
}
134190
}

pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
1515
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
1616
# Read more about iOS versioning at
1717
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18-
version: 1.5.0+10
18+
version: 1.5.1+11
1919

2020
environment:
2121
sdk: ">=2.7.0 <3.0.0"
@@ -39,6 +39,7 @@ dependencies:
3939
provider: ^4.1.3
4040
crypto: ^2.1.4
4141
flutter_local_notifications: ^1.4.4+1
42+
pull_to_refresh: ^1.6.0
4243

4344

4445
# The following adds the Cupertino Icons font to your application.

0 commit comments

Comments
 (0)