控件类,
里面放了很多自己写的一些组件,所以有很多相机用不到的引用,
但为了防止误删一些引用,所有的都没有删除,如果拿去用,灰色的可以直接删掉即可,
另外也可以传网络图片进去显示,格式为:

    PhotoFrame(imagesShow:_imagesShow);_imagesShow = [{id: 60, image: https://www.tricklen.com/publicImage/1bed62c0e9e7406795317f1b16e94632.jpg},{id: 61, image: https://www.tricklen.com/publicImage/ed179d808682455e9cf8b8f0f9d40f08.jpg},{id: 62, image: https://www.tricklen.com/publicImage/4015cf30afd94e60a3d3a5b2bd562827.jpg},{id: 137, image: https://www.tricklen.com/publicImage/3046cc0f8d8746e7a0f3c70cb7add240.jpg},{id: 138, image: https://www.tricklen.com/publicImage/5a668a7baae941a6ac826978ddbdf84e.jpg}];

其中,id为网图的id,是为了删除识别的需要


import 'package:flutter/material.dart';
import 'dart:math' as math;
import 'package:redenvelope/pages/extendBlackList/blackLiatDetails.dart';
import 'package:redenvelope/pages/extendBlackList/blackLiatDetails1.dart';
import 'package:redenvelope/constant/colors.dart';
import 'package:redenvelope/widget/UserImg.dart';
import 'package:fluttertoast/fluttertoast.dart'; //弹出框库
import 'package:image_picker/image_picker.dart'; //调用相机 相册
import 'package:dio/dio.dart';
import 'dart:io';
import 'package:photo/photo.dart'; //调用photo库
import 'package:photo_manager/photo_manager.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart'; //图片压缩
import 'dart:async';
import 'package:redenvelope/constant/App.dart';
import 'package:redenvelope/widget/UserImg.dart';
import 'package:redenvelope/pages/extendBlackList/domeData.dart';// 相机组件
class PhotoFrame extends StatefulWidget{var imagesShow;PhotoFrame({this.imagesShow});@overrideState<StatefulWidget> createState() {print("---------------图片是否传递---------------------");print(imagesShow);return new PhotoFrameState();}
}class PhotoFrameState extends State<PhotoFrame> with WidgetsBindingObserver {List<Widget> _imageShow = [];// 获取的需要显示的数组List _imageUrlShow = [];var item; //数据封装Widget addImage;int index = 1;List<String> imageUrl = []; //存放偶像头像地址的数组File _image; //当前图片List<File> images = []; //记录所有图片List<Widget> ConList = []; //显示复数图片的数组List<UploadFileInfo> _rq = []; //FormData内传递的值// 单张相机取图片Future getImage() async {var image = await ImagePicker.pickImage(source: ImageSource.camera); //相机_image = image;print(_image);images.add(_image);ff();}// 多张连选取图void _pickImage() async {List<AssetEntity> imgList = await PhotoPicker.pickAsset(//需要BuildContextcontext: context,///以下是可选参数。themeColor: AppColors.colorPrimary,//标题颜色和底部颜色padding: 1.0,//项目填充dividerColor: Colors.grey,//分隔线颜色disableColor: Colors.grey.shade300,//复选框禁用颜色itemRadio: 0.88,//内容项目radiomaxSelected: 8 - images.length -_imageUrlShow.length,//最大选择器图像计数provider: I18nProvider.chinese,//提供者:I18nProvider.chinese,// i18n提供者,默认为中文。 ,您可以自定义I18nProvider或使用ENProvider()rowCount: 3,//项目行数textColor: Colors.white,//文字颜色thumbSize: 150,//预览拇指大小,默认为64sortDelegate: SortDelegate.common,//默认是常见的,或者您可以自定义委托来对图库进行排序checkBoxBuilderDelegate: DefaultCheckBoxBuilderDelegate(activeColor: Colors.white,unselectedColor: Colors.white,),//默认为DefaultCheckBoxBuilderDelegate,或者您创建自定义委托以创建复选框//loadingDelegate: this,//如果你想构建自定义加载小部件,请扩展LoadingDelegate,[参见example / lib / main.dart]badgeDelegate: const DurationBadgeDelegate(),);//List<String> r = [];//路径for (var e in imgList) {_image = await e.file;//r.add(_image.absolute.path);//获取路径print(_image);images.add(_image);}ff();}// 处理图片void ff() {if (ConList.length > 1) {ConList.removeRange(1, ConList.length);}// 先读取传过来的图片,并显示if(_imageUrlShow.length!=0){for (var i = 0; i < _imageUrlShow.length; i++) {ConList.add(new Stack(alignment: const FractionalOffset(1.30, -0.3),children: <Widget>[Container(height: 95,width: 95,child: Image.network(_imageUrlShow[i]["image"], fit: BoxFit.cover),),IconButton(iconSize: 20,icon: Container(child: Icon(Icons.clear,color: Colors.black,),decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(10.0), //10像素圆角),),onPressed: () {setState(() {print("--------------------是否传递图片过来过---------------------------");print(_imageUrlShow[i]["id"].toString());print(ConList);print(_imageUrlShow);// 添加删除图片的idSaveData.imagesRemoveId =SaveData.imagesRemoveId +_imageUrlShow[i]["id"].toString()+"|";//删除数组中存储的图片地址var x = _imageUrlShow.remove(_imageUrlShow[i]);print(x);//删除组件ConList.remove(ConList[i + 1]);ff();});},),],),);}}// 在读取本地图片,并显示if(images.length!=0){for (var i = 0; i < images.length; i++) {ConList.add(new Stack(alignment: const FractionalOffset(1.30, -0.3),children: <Widget>[Container(height: 95,width: 95,child: Image.file(images[i], fit: BoxFit.cover),),IconButton(color: Colors.grey[350],iconSize: 20,icon: Container(child: Icon(Icons.clear,color: Colors.black,),decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.circular(10.0), //10像素圆角),),onPressed: () {setState(() {//删除当前图片_image = null;//删除数组中存储的图片地址var x = images.remove(images[i]);print(x);//删除组件ConList.remove(ConList[i + 1]);print(ConList);ff();});},),],),);}_saveDate();}setState(() {});}// 封装数据Future _saveDate() async {_rq.clear();//压缩图片并封装for (var i = 0, len = images.length; i < len; i++) {File file = images[i];file = await FlutterImageCompress.compressAndGetFile(file.absolute.path,Directory.systemTemp.path + '/head' + i.toString() + '.jpg',minWidth: 1920,minHeight: 1080,quality: 60,);_rq.add(new UploadFileInfo(file, App.userid.toString() + i.toString() + ".jpg"));}SaveData.imagesListFlie   = images;SaveData.imagesList   = _rq;print("图片文件数组长度"+SaveData.imagesListFlie.length.toString());print("图片上传数据流数组长度"+SaveData.imagesList.length.toString());return true;}@overridevoid initState() {super.initState();_imageUrlShow = widget.imagesShow==null?[]:widget.imagesShow;ConList.add(Container(color: Colors.grey[200],height: 95,width: 95,child: FlatButton(onPressed: () {//弹出底部弹窗showModalBottomSheet(context: context,builder: (BuildContext context) {return Column(mainAxisSize: MainAxisSize.min,children: <Widget>[Container(decoration: BoxDecoration(//背景装饰borderRadius: BorderRadius.circular(5.0),),child: Column(mainAxisSize: MainAxisSize.min,children: <Widget>[ListTile(title: Center(child: Center(child: Text('请选择',style: TextStyle(color: Colors.black26,fontFamily:'appIconFonts'),),),),),Divider2(),ListTile(title: Center(child: Text("拍照",style: TextStyle(fontFamily:'appIconFonts'),),),onTap: () {//调用相机Navigator.of(context).pop();images.length + _imageUrlShow.length < 8? getImage(): Fluttertoast.showToast(msg: "图片的数量不能超过8张",toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.CENTER,timeInSecForIos: 1,backgroundColor: Colors.black12,textColor: Colors.black,fontSize: 16.0);},),Divider2(),ListTile(title: Center(child: Text("从本地相册选择",style: TextStyle(fontFamily:'appIconFonts'),),),onTap: () {Navigator.of(context).pop();//读取相册images.length + _imageUrlShow.length < 8? _pickImage(): Fluttertoast.showToast(msg: "图片的数量不能超过8张",toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.CENTER,timeInSecForIos: 1,backgroundColor: Colors.black12,textColor: Colors.black,fontSize: 16.0);},),],),),Container(height: 10,color: Colors.black26,),ListTile(title: Center(child: Text("取消",style: TextStyle(fontWeight: FontWeight.w600,fontFamily:'appIconFonts'),textScaleFactor: 1.0,),),),],);});},child: Icon(Icons.add_a_photo,color: Colors.black26,)),));ff();}@overridevoid dispose() {super.dispose();}@overrideWidget build(BuildContext context) {if (App.wangLuoZhaugnTai == 1) {return Center(child: Text('网络错误,无法执行...',style: TextStyle(fontFamily:'appIconFonts'),),);}print(ConList);return Container(
//padding: EdgeInsets.fromLTRB(10, 5, 10, 5),margin: EdgeInsets.only(left: 10.0, right: 10.0, bottom: 0.0),child: Container(child: Wrap(spacing: 8.0, // 主轴(水平)方向间距runSpacing: 4.0, // 纵轴(垂直)方向间距children: ConList,),));}
}

需要几个插件
image_picker
flutter_image_compress
photo


这个是压缩图片的,非必须,但是如果不用,就可以直接注释掉关于这个插件的调用

调用很简单,一句话,如果不用显示上次图片,不用传递参数

 PhotoFrame();

另外需要一个存储类,用来存储选中的图片

// 存储选择图片
class SaveData {// 存储图片文件static  List imagesListFlie=[] ;// 存储图片字节码static  List imagesList = [];// 需要删除的图片的id,这些图片为上次上传的图片static  String imagesRemoveId = '';// 当前坐标static double X;static double Y;// 清除缓存,初始化数据static void  clearListFlie(){SaveData.imagesListFlie.clear();SaveData.imagesList.clear();SaveData.imagesRemoveId = "";}}

clearListFlie方法用于重复调用此控件的时候防止上次的数据残留,可以写在每次调用控件的之前

flutter 仿微信朋友圈发布图片相关推荐

  1. 安卓开发仿微信图片拖拽_仿微信朋友圈发表图片拖拽和删除功能

    原标题:仿微信朋友圈发表图片拖拽和删除功能 中国联通在香港公布了上市公司2017年中期业绩.2017年上半年,公司主要业绩指标持续向好,收入稳步回升,服务收入达到人民币1,241.1亿元,同比增长3. ...

  2. Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)

    原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /*** 仿微信朋友圈发布动态* 拍照或图库选择 * 压缩图片并保存**/ ...

  3. Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)附源码

             原创作品,转载请注明出处:http://blog.csdn.net/zhang3776813/article/details/52092591 最近项目需求中要用到类似微信朋友圈发布 ...

  4. Android 仿微信朋友圈添加图片

    github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...

  5. android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...

    AssNineGridView 仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图(可自定义). 写在前面 这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀 ...

  6. Android 实现仿微信朋友圈九宫格图片+NineGridView+ImageWatcher(图片查看:1.预览,2.拖动,3.放大,4.左右滑动,5.长按保存到手机)的功能

    一.测试 实现: 二.添加依赖包: implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.recycl ...

  7. 仿微信朋友圈选择图片

    仿微信朋友圈选择图片 该版本实现了如下功能: 1.从相册选择图片,对图片进行了缓存处理,选择图片的时候,图片不会出现OOM 2.加入了拍照功能 3.加入了图库功能,可以让你的图片滚动起来了,如果你想使 ...

  8. Android仿微信朋友圈发图片和文字

    Android仿微信朋友圈发图片和文字的一个开源项目,其在github上的项目主页是:https://github.com/zhangphil/FangWeiXinPengYouQuanFaTuPia ...

  9. 一个仿微信朋友圈的图片查看器,使用超级简单!

    PhotoViewer 项目地址:wanglu1209/PhotoViewer  简介:一个仿微信朋友圈的图片查看器,使用超级简单! 更多:作者   提 Bug 标签:        该图片查看器是模 ...

  10. 安卓开发仿微信图片拖拽_Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

最新文章

  1. php安装redis扩展详细步骤 不会可以加QQ
  2. 【随】WCF传输大数据的设置
  3. ios15之取消UITabbleViewCell的高亮效果
  4. Windows与Linux之间海量文件的传输与Linux下大小写敏感问题
  5. redis linux服务,linux服务之redis
  6. CCF201812-2 小明放学
  7. (转)版本管理工具介绍——SVN篇(二)
  8. 如何进行cad地理配准_【教程】自带高度建筑轮廓如何制作分色图
  9. 微课|中学生可以这样学Python(例4.3):百钱买百鸡
  10. Codeforces Round #574 (Div. 2)
  11. matlab的输入输出常见语句
  12. 以太网--车载以太网
  13. 工业相机录像丢帧的解决方案
  14. js中的json和ascii转换
  15. matlab勾股定理,勾股定理的两个物理证明
  16. 电源模块设计过程(降压、正压转负压)-MC34063
  17. 2021网站泛目录源码系统疯狂收录超快排名放在二级目录即可
  18. 安徽大学2021计算机考研专业课题型,安徽大学电子信息工程学院2021研究生入学考试科目调整通知...
  19. 算法面试必备-----数据库与SQL面试题
  20. 民事诉讼法知识点详细版

热门文章

  1. 设计心理学读书笔记 之一 记忆的结构
  2. 浏览器之硬件加速机制
  3. deeplearning.36车辆识别YOLO算法实践
  4. fterm linux ssh 乱码,用fterm ssh时出现如下乱码,请问如何解决
  5. 富士施乐p355d_富士施乐p355d驱动下载
  6. php storm netbean,的Android R.drawable找不到符号...(使用netbean)
  7. McAfee VirusScan Enterprise
  8. VM虚拟机BT5下对usb无线网卡的配置
  9. php底部漂浮广告位代码,网站顶部底部(上下)悬浮(漂浮)广告位代码
  10. 【最新版win10 adb环境变量配置】