X Tutup
Skip to content

Commit dc01aaf

Browse files
committed
增加图片保存到本地的支持
1 parent 5f7ae3f commit dc01aaf

File tree

7 files changed

+110
-1
lines changed

7 files changed

+110
-1
lines changed

RECORD.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11

2+
3+
https://github.com/flutter/plugins/tree/master/packages/webview_flutter
4+
未发布的
5+
6+
7+
8+
9+
10+
11+
12+
13+
14+
15+
16+
17+
218
### String 字符串
319

420
在哪里存储字符串? 如何存储不同的语言

VERSION.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* webview点击跳转。
77
* markdown htmlview 表格。
88
* 版本信息列表
9+
* 监听滚动,设置底部和顶部隐藏显示
910

1011
### 1.1.3
1112
* 修复详情tab切换问题。

android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
to allow setting breakpoints, to provide hot reload, etc.
77
-->
88
<uses-permission android:name="android.permission.INTERNET"/>
9+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
910

1011
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
1112
calls FlutterMain.startInitialization(this); in its onCreate method.

lib/common/utils/CommonUtils.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'dart:async';
22
import 'dart:convert';
3+
import 'dart:io';
34

45
import 'package:flutter/material.dart';
56
import 'package:flutter/services.dart';
7+
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
68
import 'package:fluttertoast/fluttertoast.dart';
79
import 'package:gsy_github_app_flutter/common/localization/DefaultLocalizations.dart';
810
import 'package:gsy_github_app_flutter/common/net/Address.dart';
@@ -14,7 +16,9 @@ import 'package:gsy_github_app_flutter/common/style/GSYStyle.dart';
1416
import 'package:gsy_github_app_flutter/common/utils/NavigatorUtils.dart';
1517
import 'package:gsy_github_app_flutter/widget/GSYFlexButton.dart';
1618
import 'package:gsy_github_app_flutter/widget/IssueEditDIalog.dart';
19+
import 'package:permission_handler/permission_handler.dart';
1720
import 'package:flutter_spinkit/flutter_spinkit.dart';
21+
import 'package:path_provider/path_provider.dart';
1822
import 'package:redux/redux.dart';
1923
import 'package:url_launcher/url_launcher.dart';
2024
import 'package:flutter_statusbar/flutter_statusbar.dart';
@@ -73,6 +77,43 @@ class CommonUtils {
7377
}
7478
}
7579

80+
static getLocalPath() async {
81+
Directory appDir;
82+
if (Platform.isIOS) {
83+
appDir = await getApplicationDocumentsDirectory();
84+
} else {
85+
appDir = await getExternalStorageDirectory();
86+
}
87+
PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
88+
if (permission != PermissionStatus.granted) {
89+
Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]);
90+
if (permissions[PermissionGroup.storage] != PermissionStatus.granted) {
91+
return null;
92+
}
93+
}
94+
String appDocPath = appDir.path + "/gsygithubappflutter";
95+
Directory appPath = Directory(appDocPath);
96+
await appPath.create(recursive: true);
97+
return appPath;
98+
}
99+
100+
static saveImage(String url) async {
101+
Future<String> _findPath(String imageUrl) async {
102+
final cache = await CacheManager.getInstance();
103+
final file = await cache.getFile(imageUrl);
104+
if(file == null) {
105+
return null;
106+
}
107+
Directory localPath = await CommonUtils.getLocalPath();
108+
if(localPath == null) {
109+
return null;
110+
}
111+
final result = await file.copy(localPath.path + file.path.substring(file.path.lastIndexOf("/")));
112+
return result.path;
113+
}
114+
return _findPath(url);
115+
}
116+
76117
static getFullName(String repository_url) {
77118
if (repository_url != null && repository_url.substring(repository_url.length - 1) == "/") {
78119
repository_url = repository_url.substring(0, repository_url.length - 1);

lib/page/PhotoViewPage.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_spinkit/flutter_spinkit.dart';
3+
import 'package:fluttertoast/fluttertoast.dart';
34
import 'package:gsy_github_app_flutter/common/style/GSYStyle.dart';
5+
import 'package:gsy_github_app_flutter/common/utils/CommonUtils.dart';
46
import 'package:gsy_github_app_flutter/widget/GSYCommonOptionWidget.dart';
57
import 'package:gsy_github_app_flutter/widget/GSYTitleBar.dart';
68
import 'package:photo_view/photo_view.dart';
@@ -21,6 +23,16 @@ class PhotoViewPage extends StatelessWidget {
2123
OptionControl optionControl = new OptionControl();
2224
optionControl.url = url;
2325
return new Scaffold(
26+
floatingActionButton: new FloatingActionButton(
27+
child: new Icon(Icons.file_download),
28+
onPressed: () {
29+
CommonUtils.saveImage(url).then((res) {
30+
if (res != null) {
31+
Fluttertoast.showToast(msg: res);
32+
}
33+
});
34+
},
35+
),
2436
appBar: new AppBar(
2537
title: GSYTitleBar("", rightWidget: new GSYCommonOptionWidget(optionControl)),
2638
),
@@ -31,7 +43,7 @@ class PhotoViewPage extends StatelessWidget {
3143
loadingChild: Container(
3244
child: new Stack(
3345
children: <Widget>[
34-
new Center(child: new Image.asset(GSYICons.DEFAULT_IMAGE, height: 150.0, width: 150.0)),
46+
new Center(child: new Image.asset(GSYICons.DEFAULT_IMAGE, height: 180.0, width: 180.0)),
3547
new Center(child: new SpinKitFoldingCube(color: Colors.white30, size: 60.0)),
3648
],
3749
),

pubspec.lock

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,13 @@ packages:
188188
description: flutter
189189
source: sdk
190190
version: "0.0.0"
191+
flutter_cache_manager:
192+
dependency: "direct main"
193+
description:
194+
name: flutter_cache_manager
195+
url: "https://pub.dartlang.org"
196+
source: hosted
197+
version: "0.1.2"
191198
flutter_localizations:
192199
dependency: "direct main"
193200
description: flutter
@@ -284,6 +291,13 @@ packages:
284291
url: "https://pub.dartlang.org"
285292
source: hosted
286293
version: "0.13.3+3"
294+
http:
295+
dependency: transitive
296+
description:
297+
name: http
298+
url: "https://pub.dartlang.org"
299+
source: hosted
300+
version: "0.11.3+17"
287301
http_multi_server:
288302
dependency: transitive
289303
description:
@@ -403,6 +417,20 @@ packages:
403417
url: "https://pub.dartlang.org"
404418
source: hosted
405419
version: "0.1.2"
420+
path_provider:
421+
dependency: "direct main"
422+
description:
423+
name: path_provider
424+
url: "https://pub.dartlang.org"
425+
source: hosted
426+
version: "0.4.1"
427+
permission_handler:
428+
dependency: "direct main"
429+
description:
430+
name: permission_handler
431+
url: "https://pub.dartlang.org"
432+
source: hosted
433+
version: "2.0.0"
406434
petitparser:
407435
dependency: transitive
408436
description:
@@ -569,6 +597,13 @@ packages:
569597
url: "https://pub.dartlang.org"
570598
source: hosted
571599
version: "0.9.0+5"
600+
uuid:
601+
dependency: transitive
602+
description:
603+
name: uuid
604+
url: "https://pub.dartlang.org"
605+
source: hosted
606+
version: "1.0.3"
572607
vector_math:
573608
dependency: transitive
574609
description:

pubspec.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ dependencies:
3030
flutter_localizations:
3131
sdk: flutter
3232
event_bus: ^1.0.1
33+
flutter_cache_manager: ^0.1.2
34+
path_provider: ^0.4.1
35+
permission_handler: ^2.0.0
3336

3437
dev_dependencies:
3538
build_runner: ^0.10.1+1

0 commit comments

Comments
 (0)
X Tutup