Flutter 使用image_gallery_saver保存图片
Flutter 使用image_gallery_saver保存图片
其实我们开发项目app的时候, 你会发现有很多问题, 比如保存图片功能时 ,不仅导入包依赖包: image_gallery_saver 就能解决问题的.
废话不多说,先上效果图:
保存图片功能共分为两步
第一步: 权限开启问题(permission_handler插件库地址: https://pub.dev/packages/permission_handler )
- 导包:
permission_handler: ^3.0.0 #申请储存权限插件
- 配置权限
<!-- 开启读写storage权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
权限配置的位置效果图如下:
第二步: 使用 image_gallery_saver 插件, 插件地址链接: https://pub.dev/packages/image_gallery_saver
- 导包
mage_gallery_saver: ^1.5.0 #图片保存到本地
- 项目代码引入
import 'package:image_gallery_saver/image_gallery_saver.dart'; //保存图片插件
- 案例代码如下
import 'package:flutter/material.dart';
import 'dart:io'; //判断ios还是android插件
import 'package:flutter_drag_scale/flutter_drag_scale.dart'; //图片点击放大插件
import 'package:image_gallery_saver/image_gallery_saver.dart'; //保存图片插件
import 'dart:typed_data'; //保存图片插件
// import '../../utils/http.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:dio/dio.dart';
import 'package:oktoast/oktoast.dart'; //toast插件 class OpenImg extends StatefulWidget{
final String url;
// final Function onTap;
const OpenImg({Key key, this.url}):super(key: key);
@override
_OpenImgState createState() => _OpenImgState();
} class _OpenImgState extends State<OpenImg>{ void initState(){
super.initState();
// 检查并请求权限
var permission = PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
print("permission status is " + permission.toString());
PermissionHandler().requestPermissions(<PermissionGroup>[
PermissionGroup.storage, // 在这里添加需要的权限--储存权限
]);
} //点击保存图片
// 需要引入一下库
// import 'package:image_gallery_saver/image_gallery_saver.dart';
// import 'dart:typed_data';
void _save() async {
var response = await Dio().get("http://pic3.zhimg.com/2d41a1d1ebf37fb699795e78db76b5c2.jpg", options: Options(responseType: ResponseType.bytes));
final result = await ImageGallerySaver.saveImage(
Uint8List.fromList(response.data)
);
// 判断ios还是android,故需要引入 import 'dart:io';
if(Platform.isIOS){
if(result){
showToast('成功保存到相册中');
}else{
showToast('保存失败');
}
}else{
if(result != null){
showToast('成功保存到相册中');
}else{
showToast('保存失败');
}
}
} @override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
elevation: 0.0, //导航栏阴影
actions: [
PopupMenuButton(
child: Icon(Icons.more_vert),
itemBuilder: (BuildContext context){
return <PopupMenuItem<String>>[
PopupMenuItem<String>(child: Text("下载图片"), value: "download",),
PopupMenuItem<String>(child: Text("分享图片"), value: "share",),
];
},
onSelected: (String action) {
switch (action) {
case "download":
_save();
break;
case "share":
print("分享图片");
break;
}
},
onCanceled: () {
print("onCanceled");
}
)
],
),
body: DragScaleContainer(
doubleTapStillScale: true,
child: Container(
color: Colors.black,
height: MediaQuery.of(context).size.height,
child: Image.network(this.widget.url, fit: BoxFit.contain),
),
) );
}
}
注意以上代码的备注说明,不然会有报错的可能性.
谢谢大家!!!有问题评论区见
Flutter 使用image_gallery_saver保存图片的更多相关文章
- flutter 保存图片到本地
f'lutter 图片的保存 分为俩步: 1.开启存储图片权限开启权限需要用到permission_handler pubspec 添加 permission_handler: ^3.0.1下载包就可 ...
- Flutter · Python AI 弹幕播放器来袭
AI智能弹幕(也称蒙版弹幕):弹幕浮在视频的上方却永远不会挡住人物.起源于哔哩哔哩的web端黑科技,而后分别实现在IOS和Android的app端,如今被用于短视频.直播等媒体行业,用户体验提升显著. ...
- HTML 保存图片到本地
具体方法有两种 一种是 利用canvas的 toDataUrl 和Html5 里面的 <a>标签里面的 Download 属性 虽然 Download 的兼容性不怎么样 但是在文章后 ...
- Android 保存图片到SQLite
[转:原文] Resources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ico ...
- JS/HTML 保存图片到本地:HTML <a> download 属性
JS如何保存图片到本地呢?自己百度一下吧! 这里想要说的是,可以利用 HTML 的 <a> 标签 来是实现保存图片到本地的功能,参考代码如下: <a href="http: ...
- [Android Pro] Android保存图片到系统图库
http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery/ http://blog.csdn.net/x ...
- IOS UIImagePickerController 保存图片到 相册
// 异步下载图片 dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); disp ...
- android打开,保存图片到sd卡,显示图片
1.打开根目录下test.jpg Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getA ...
- Android WebView Long Press长按保存图片到手机
<span style="font-size:18px;">首先要先注册长按监听菜单 private String imgurl = ""; /** ...
随机推荐
- java class类和object类
Class类 介绍 Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息 Java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类( ...
- mongodb在win10下的安装和配置
一.准备 下载mongodb https://www.mongodb.com/download-center/community 该实例中使用的是:mongodb-win32-x86_64-2008p ...
- DML语言(数据操纵语言)
#DML语言/*数据操作语言:插入:insert修改:update删除:delete */ #一.插入语句#方式一:经典的插入/*语法:insert into 表名(列名,...) values(值1 ...
- Docker 安装及配置镜像加速
Docker 版本 随着 Docker 的飞速发展,企业级功能的上线,更好的服务意味着需要支付一定的费用,目前 Docker 被分为两个版本: community-edition 社区版 enterp ...
- python数据类型和运算符
一.python类型判断 type,isinstance type(变量或常量):返回数据类型 a = 23.3print(type(a))b = 2e3print(b, type(b))输出: &l ...
- MyBatis源码分析之核心处理层
目录 1 传统方式源码剖析 1.1 初始化流程 1.2 执行SQL流程 1.2.1 获取SqlSession 1.2.2 执行SqlSession接口 1.2.3 执行Executor接口 1.2.4 ...
- mysql再回首
Mysql与Oracle的区别 1.实例区别 Mysql是一个轻量型数据库,开源免费.Oracle是收费的而且价格非常高. Mysql一个实例可以操作多个库,而Oracle一个实例只能对应一个库. M ...
- .NET Core3.1 Dotnetty实战第一章
一.概要 本系列文章主要讲述由微软Azure团队研发的.net的版本的netty,Dotnetty.所有的开发都将基于.net core 3.1版本进行开发. Dotnetty是什么,原本Netty是 ...
- Node.js 学习笔记之四:使用数据库
这部分示例将示范SQLite3.MongoDB这两种不同类型的数据库在 Node.js 中的使用方法.首先,我们要在code目录下执行mkdir 06_database命令来创建用于存放这一组示例的目 ...
- android MVVM(2)用数据绑定关联VM 与 V
1.官方文档 https://developer.android.com/topic/libraries/data-binding/architecture 2.简介 数据绑定库 可与MVVM 架构组 ...