当前位置: 首页 > ds >正文

flutter 选择图片 用九宫格显示图片,右上角X删除选择图片,点击查看图片放大缩小,在多张图片可以左右滑动查看图片

flutter 选择图片 用九宫格显示图片,右上角X删除选择图片,点击查看图片放大缩小,在多张图片可以左右滑动查看图片

************ 暂无压缩图片功能 *********

显示图片 —

import 'dart:io';import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:photo_view/photo_view.dart';///图片选择和查看图片
class ImageSelectorGrid extends StatefulWidget {_ImageSelectorGridState createState() => _ImageSelectorGridState();
}class _ImageSelectorGridState extends State<ImageSelectorGrid> {final ImagePicker _picker = ImagePicker();List<File> selectedImages = [];int maxImages = 9; // 最大允许选择的图片数量Future<void> _pickImages2() async {//暂时没有限制final pickedFiles = await _picker.pickMultiImage(limit: 2);if (pickedFiles.isNotEmpty) {setState(() {selectedImages.addAll(pickedFiles.map((f) => File(f.path)));});}}///选取9张Future<void> _pickImages() async {final pickedFiles = await _picker.pickMultiImage();List<XFile> list =pickedFiles.take(maxImages - selectedImages.length).toList();if (list.isNotEmpty) {setState(() {selectedImages.addAll(list.map((f) => File(f.path)));});}}Widget build(BuildContext context) {return GridView.builder(gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, // 九宫格布局crossAxisSpacing: 8.0,mainAxisSpacing: 8.0,),itemCount: (selectedImages.length >= 9)? selectedImages.length: selectedImages.length + 1, // +1 表示加号按钮itemBuilder: (context, index) {if (index == selectedImages.length) {// 最后一个位置放加号按钮return GestureDetector(onTap: _pickImages,child: Container(decoration: BoxDecoration(borderRadius: BorderRadius.circular(8.0),color: Colors.grey[200], // 设置背景颜色),child: const Center(child: Icon(Icons.add, size: 40, color: Colors.blue), // 加号图标),),);} else {return Stack(children: [GestureDetector(onTap: () {// 如果有多张图片,使用 PhotoView 支持滑动切换final PageController controller =PageController(initialPage: index);Navigator.push(context,MaterialPageRoute(builder: (context) => Scaffold(appBar: AppBar(title: const Text('图片预览'),),body: PageView.builder(controller: controller,// 使用 PageController 控制初始页面itemCount: selectedImages.length,onPageChanged: (int page) {},itemBuilder: (context, pageIndex) {return Hero(tag: 'image_$pageIndex',child: PhotoView(imageProvider: FileImage(File(selectedImages[pageIndex].path)),),);},),),),);/// 点击图片查看大图 --- 单张图// Navigator.push(//   context,//   MaterialPageRoute(//     builder: (context) => PhotoView(//       imageProvider: FileImage(selectedImages[index]),//     ),//   ),// );},child: Container(decoration: BoxDecoration(//border: Border.all(color: Colors.blue, width: 2.0), // 添加蓝色边框borderRadius: BorderRadius.circular(8.0), // 添加圆角image: DecorationImage(image: FileImage(selectedImages[index]),fit: BoxFit.cover, // 将图片适应容器),),),),Positioned(top: 5.0,right: 5.0,child: GestureDetector(onTap: () => _handleIconTap(index),child: const Icon(Icons.clear, size: 30, color: Colors.red),),),],/* Image.file(selectedImages[index],fit: BoxFit.cover, // 将图片适应容器),*/);}},);}// 处理图标点击事件void _handleIconTap(int index) {// 这里可以添加图标点击后要执行的操作,例如删除图片等showDialog(context: context,builder: (context) => AlertDialog(title: const Text('操作提示'),content: Text('是否删除这张图片?'),actions: [TextButton(onPressed: () => Navigator.pop(context),child: const Text('取消'),),TextButton(onPressed: () {setState(() {selectedImages.removeAt(index);});Navigator.pop(context);},child: const Text('删除'),),],),);}
}

添加插件

需要自己添加权限申请

  #选择图片image_picker: ^1.0.4#查看图片photo_view: ^0.14.0
http://www.xdnf.cn/news/2468.html

相关文章:

  • QT中的文件操作
  • 在CentOS 8上在线安装Docker
  • ubuntu扩展逻辑卷并调整文件系统大小步骤
  • 1到12月和1到31日英文表达
  • Lua 第10部分 模式匹配
  • 在AWS Glue中实现缓慢变化维度(SCD)的三种类型
  • 阿里云直接对系统云盘扩容
  • OceanBase数据库-学习笔记1-概论
  • 为什么从Word复制到PPT的格式总是乱掉?
  • 使用Aspose.Words将Word转换为HTML时,字体样式丢失问题及解决方法
  • OpenCV彩色图像分割
  • 操作系统:计算机世界的基石与演进
  • 展销编辑器操作难度及优势分析​
  • kafka 中消费者 groupId 是什么
  • Word处理控件Spire.Doc系列教程:C# 通过模板创建 Word 文档
  • 【Java】IntelliJ IDEA 社区版安装
  • MAVLink协议:原理、应用与实践
  • 4.26 数据交互升级引入配置文件
  • Python 第 12、13 节课 - 元组和列表
  • C语言 函数递归
  • TP4056 电池管理芯片介绍及电路应用
  • 计算机二级MS Office第八套演示文稿
  • Pygame入门:零基础打造你的第一个游戏窗口
  • [C++] 高精度乘法
  • 八猴渲染器三维场景实时预览软件 Marmoset Toolbag 5.01 安装包免费下载
  • 九、内联函数(Inline Functions)
  • 《Keras 3部署全攻略:从新手到实战高手》
  • 网络流之最大流(Dinic)
  • Springboot基础篇
  • 牛客:链表内指定区间反转