需求:实现一个九宫格的效果,要求能够多选照片。
具体描述:
1.实现类似微信九宫格,没图片的时候有一张添加图片,点击该图片可以在相册中选择,当图片未满9个的时候,该图片一直跟在最后,当图片满足9个的时候该添加图片消失。点击右上角X可以移除图片
2.当点击小图的时候能够进行放大的预览,点击大图,预览消失。
3.图片能够进行批量上传,上传的时候进行图片压缩上传

采用的插件
dio: ^4.0.0
fluttertoast: ^8.0.8
image_picker: ^0.8.4+1

#用到的图片放在images文件夹下面
delete.png
addphoto.png


// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ignore_for_file: public_member_api_docsimport 'dart:io';
import 'package:app_flutter/common/global.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';class ImageUploadRoute extends StatefulWidget {ImageUploadRoute({Key? key, this.title}) : super(key: key);final String? title;@override_ImageUploadState createState() => _ImageUploadState();
}class _ImageUploadState extends State<ImageUploadRoute> {//编辑文本late TextEditingController _controller;//图片上传相关String  _title="图片上传";List<XFile> _imageFileList=List.empty(growable: true);//存放选择的图片final ImagePicker _picker = ImagePicker();int maxFileCount=9;//最大选择图片数量dynamic _pickImageError;int _bigImageIndex=0;//选中的需要放大的图片的下标bool _bigImageVisibility=false;//是否显示预览大图//获取当前展示的图的数量int getImageCount() {if(_imageFileList.length<maxFileCount){return _imageFileList.length+1;}else{return _imageFileList.length;}}Widget _handlePreview() {return _previewImages();}Widget _previewImages() {return GridView.builder(gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount:3,//每行三个childAspectRatio: 1.0,//宽高比1:1),itemBuilder: (context,index){if(_imageFileList.length<maxFileCount){//没选满if(index<_imageFileList.length){//需要展示的图片return Stack( //层叠布局 图片上面要有一个删除的框alignment: Alignment.center,children: [Positioned(top:0.0 ,left: 0.0,right: 0.0,bottom: 0.0,child:GestureDetector(child: Image.file(File(_imageFileList[index].path),fit:BoxFit.cover ),onTap:()=>showBigImage(index) ,)),Positioned(top:0.0,right: 0.0,width: 20,height: 20,child:GestureDetector(child: SizedBox(child:  Image.asset('images/delete.png'),),onTap:()=>_removeImage(index), ),),],);//return Image.file(File(_imageFileList[index].path),fit:BoxFit.cover ,) ;}else{//显示添加符号return GestureDetector( //手势包含添加按钮 实现点击进行选择图片child:Image.asset('images/addphoto.png'),onTap: ()=>_onImageButtonPressed(//执行打开相册ImageSource.gallery,context: context,imageQuality: 40,//图片压缩),);}}else {//选满了return Stack( //层叠布局 图片上面要有一个删除的框alignment: Alignment.center,children: [Positioned(top:0.0 ,left: 0.0,right: 0.0,bottom: 0.0,child: GestureDetector(child: Image.file(File(_imageFileList[index].path),fit:BoxFit.cover ),onTap:()=>showBigImage(index) ,),),Positioned(top:0.0,right: 0.0,width: 20,height: 20,child:GestureDetector(child: SizedBox(child:  Image.asset('images/delete.png'),),onTap:()=>_removeImage(index), ),),],) ;}},itemCount: getImageCount(),);}void _onImageButtonPressed(ImageSource source, {BuildContext? context,double? maxHeight,double? maxWidth,int? imageQuality}) async {try {final pickedFileList = await _picker.pickMultiImage(maxWidth: maxWidth,maxHeight: maxHeight,imageQuality: imageQuality,);setState(() {//pickedFileList.eif(_imageFileList.length<maxFileCount){//小于最大数量if((_imageFileList.length+(pickedFileList?.length??0))<=maxFileCount){//加上新选中的不超过最大数量pickedFileList!.forEach((element) {_imageFileList.add(element);});}else {//否则报错Global.showCenterToast("超过可选最大数量!自动移除多余的图片");int avaliableCount=maxFileCount-_imageFileList.length;for(int i=0;i<avaliableCount;i++){_imageFileList.add(pickedFileList![i]);}}}});} catch (e) {setState(() {Global.showCenterToast("$_pickImageError");//出现错误的话报错_pickImageError = e;});}}//移除图片void _removeImage(int index){setState(() {_imageFileList.removeAt(index);});}//通过双击小图的时候获取当前需要放大预览的图的下标void showBigImage(int index){setState(() {_bigImageIndex=index;_bigImageVisibility=true;});}//通过大图的双击事件 隐藏大图void hiddenBigImage(){setState(() {_bigImageVisibility=false;});}//展示大图Widget? displayBigImage(){if(_imageFileList.length>_bigImageIndex){return Image.file(File(_imageFileList[_bigImageIndex].path),fit:BoxFit.fill);}else{return null;}}//图片上传_upLoadImage() async {List<dynamic> _imgListUpload  = [];_imageFileList.forEach((element) {//遍历图片 加入到dio的批量文件里面_imgListUpload.add( MultipartFile.fromFileSync(element.path, filename: element.name));});var formData= FormData.fromMap({'files': _imgListUpload,//批量的图片'WAREHOUSEID':'TEST', //其他的参数'ORDERNO':'HZ00000000001'});try{Dio dio = new Dio();var respone = await dio.post<String>("http://192.168.1.21:8080/FlutterService/UploadImages", data: formData);if (respone.statusCode == 200) {Global.showCenterToast("上传成功!");}}catch (e) {Global.showCenterToast("上传失败!");}}//初始化的时候打开定位相关@overridevoid initState() {super.initState();_controller = TextEditingController();}@overridevoid dispose() {_controller.dispose();super.dispose();}//页面的控件布局@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(_title),),body:Stack(children: [Positioned(//占满屏幕top: 0,bottom: 0,left: 0,right: 0,child: Column(children: [TextField(maxLines: 10,minLines: 3,controller:_controller,decoration:InputDecoration(border:InputBorder.none ,fillColor:Colors.white ,filled: true,hintText: "签收情况",),),SizedBox(height: 400,child: _handlePreview(),),SizedBox(width: double.infinity,height: 50,child:ElevatedButton(style: ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20)),onPressed: _upLoadImage,child: const Text('确定'),),),],)),Positioned(top: 0,bottom: 0,left: 0,right: 0,child:Visibility(visible: _bigImageVisibility,child: GestureDetector(child:displayBigImage(),onTap: hiddenBigImage,)),),],));}}



Flutter ——图片九宫格,多图片批量上传(图片选择采用官方image_picker实现,批量上传采用dio,消息提示)相关推荐

  1. java批量上传图片_JAVA图片批量上传JS-带预览功能

    这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 pageEncoding="UTF-8"%> 新增照片 var ...

  2. 分享一个图片管理程序,图片批量上传,图片管理(有图片)

    呵呵,好久没写博客了.今天在此奉上一篇! 关于图片管理,其实做项目很多地方都用到图片管理. 比如:产品图片,新闻图片,作品图片. 现分享一篇关于图片管理的文章,希望大家能用得上. 先来看效果图吧: 上 ...

  3. php mysql存图片路径_PHP 批量下传图片 怎么保存路径到mysql

    PHP 批量上传图片 如何保存路径到mysql 在网上找到一个PHP+FLASH 的批量上传图片的程序 但是我想把图片的路径 取出来 存入MYSQL数据库中 PHP代码如下 PHP code0) { ...

  4. 移动端上(传图片太大)处理方案

    利用FileReader和FormData实现图片预览和上传(base64转二进制文件) 监听表单文件变化 文件表单的样式主要通过让它后面,通过别的DOM来美化它. <input type=&q ...

  5. java 图片上传非jsp_java问题用java代码在后台如何将jsp页面上的图片上传(是 爱问知识人...

    先到apache官方下载common-upload组件 上传 // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 上传初始化 iti ...

  6. 【报错笔记】在做图片上传时上传图片后可以跳转到上传成功界面,也没有报错,数据库中也传入了值,可是eclipse中webapp下怎样都无法生存目录。

    在做图片上传时上传图片后可以跳转到上传成功界面,也没有报错,数据库中也传入了值,可是eclipse中webapp下怎样都无法生存目录. 我使用UUID生成8级目录,在webapp下创建目录,将图片传进 ...

  7. android h5选择图片上传,js-微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)...

    值得注意的是: 1.在微信H5中选择图片运用:wx.chooseImage, 上传图片:wx.uploadImage. 2.上传图片的时候务必是一张一张的上传的(建议采用递归) 3.一张图片上传成功后 ...

  8. java下传图片到tomcat服务器后,如何在页面显示,java图片上传服务器及客户端显示图片...

    我在上一篇文章SSM+Layui实现文件上传服务器中展示了如何将图片上传至服务器,保存到SQL server数据库中,本篇文章主要讲的是将图片上传到服务器上,保存在服务器的磁盘上,然后将图片路径保存到 ...

  9. php多图片上传程序2.4.3,php多文件上传 多图片上传程序代码

    多文件上传其实就包括了图片及各种文件了,下面介绍的是一款PHP多文件上传类,一共两个文件,upp.php 和 uploadFile.php,upp.php,这是前台所显示的表单文件了,默认的是四个上传 ...

最新文章

  1. 讲真,下次打死我也不敢随便改serialVersionUID了
  2. 为什么颜值越来越重要_看脸时代来了吗?为什么这个时代越来越注重颜值?
  3. json中{}和[]的区别
  4. 【转】Scrum角色及其职责介绍
  5. Android 第五课 常用控件的使用方法(TextView、Button、EditView、 ImageView、 ProgressBar、 ProgressDialog等)
  6. 用户设置及用户默认设置
  7. 贪婪洞窟2服务器维护,12月19日贪婪洞窟2停服维护公告 贪婪洞窟2更新了什么
  8. Java知识导航总图
  9. dbcc 删除日志_有用的DBCC日志命令
  10. 软件开发工程师:程序员的职业规划就像软件工程
  11. virtual 初探
  12. 阿里巴巴举办全球数学竞赛 助力基础科学杰出人才培养
  13. 阿里天池街景字符编码YOLO5方案
  14. Docker练习安装
  15. 区块链是如何升级的?
  16. 一个极其普通程序员毕业一年的记录
  17. 4星|《经济学人2017精选书评合辑》:书都比较新且没有中译本
  18. 自动泊车轨迹规划场景介绍
  19. 他们三人都答对的题目至少有多少?
  20. war不能启动怎么解决

热门文章

  1. 猿创征文|点亮JAVA技术之灯(线程篇)
  2. 算法的时间复杂度和空间复杂度总结
  3. 自建网站开通SSL协议
  4. HEVC新技术(一):基于MVC的AMVP技术
  5. 关于Win10电脑连接WIFI时出现 “无法连接到这个网络” 问题的解决方法
  6. 中国视频展台市场现状研究分析与发展前景预测报告(2022)
  7. 一种高性能计算机网络控制技术,一种高性能流量计算机的研制
  8. 计算机一级解释,独家秘笈计算机一级错题解释.ppt
  9. 台式机做U盘启动盘----win7旗舰版原装系统重装
  10. 语音合成商业化:科大讯飞向左,魔音工坊向右