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

发布于:2025-05-02 ⋅ 阅读:(7) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到