Flutter 图片选取 image_picker

image_picker: Flutter 照片选取插件; 该老版本插件需要兼容 AndroidX, 如果是老版本 可以参照这边的进行配置!

flutter 官方androidx 兼容设置https://flutter.dev/docs/development/androidx-migrationhttps://flutter.dev/docs/development/androidx-migrationIOS 需要配置  .plist  权限 (老版本和新版本都需要)

image_picker | Flutter PackageFlutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera.https://pub.flutter-io.cn/packages/image_pickerpubspec.yaml:

dev_dependencies:
  flutter_test:
    sdk: flutter
  image_picker: ^0.8.4+1

 

 

引入插件的头文件
import 'package:image_picker/image_picker.dart';
  List<File> imgArray = [];
  final ImagePicker _picker = ImagePicker();
  Future pickImage({required ImageSource type}) async {
    Navigator.pop(context);
    var image = await _picker.pickImage(source: type);
    // List<File> cacheList = [];
    // // for (int i = 0; i < imgArray.length; i++) {
    // //   cacheList.add(imgArray[i]);
    // // }
    // cacheList.addAll(imgArray);
    // cacheList.add(File(image!.path));
    setState(() {
      imgArray.add(File(image!.path));
      //imgArray = cacheList;
      // _image = _image;
      // imgArray = imgArray.add(image!.path);
      // print('_image.path ${_image!.path}');
    });
  }

import 'package:flutter/material.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';

class PhotoSelect extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _PhotoSelectState();
  }
}

class _PhotoSelectState extends State<PhotoSelect> {
  List<File> imgArray = [];
  final ImagePicker _picker = ImagePicker();
  Future pickImage({required ImageSource type}) async {
    Navigator.pop(context);
    var image = await _picker.pickImage(source: type);
    // List<File> cacheList = [];
    // // for (int i = 0; i < imgArray.length; i++) {
    // //   cacheList.add(imgArray[i]);
    // // }
    // cacheList.addAll(imgArray);
    // cacheList.add(File(image!.path));
    setState(() {
      imgArray.add(File(image!.path));
      //imgArray = cacheList;
      // _image = _image;
      // imgArray = imgArray.add(image!.path);
      // print('_image.path ${_image!.path}');
    });
  }

  @override
  Widget build(BuildContext context) {
    String title = (ModalRoute.of(context)!.settings.arguments as Map)['desc'];
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Stack(
        children: [
          Positioned(
            right: 10,
            bottom: 20,
            child: SizedBox(
              width: 50,
              height: 50,
              child: ClipOval(
                child: Container(
                  color: Colors.blue,
                  child: IconButton(
                    color: Colors.white,
                    onPressed: _showSheetAction,
                    icon: Icon(
                      Icons.photo_camera,
                      size: 30,
                    ),
                  ),
                ),
              ),
            ),
          ),
          Center(
            child: imgArray.length > 0
                ? Wrap(
                    spacing: 5,
                    runSpacing: 5,
                    children: imgArray
                        .map((item) => _imageItem(imagePth: item))
                        .toList(),
                  )
                : Text('您还没有添加图片'),
          )
        ],
      ),
    );
  }

  Widget _imageItem({required File imagePth}) {
    return Stack(
      children: [
        ClipRRect(
          borderRadius: BorderRadius.circular(7),
          child: Image.file(
            imagePth,
            width: 110,
            height: 70,
            fit: BoxFit.fitWidth,
          ),
        ),
        Positioned(
          right: 5,
          top: 5,
          child: GestureDetector(
            onTap: () {
              //print('点击了删除');
              // List<File> cacheList = [];
              // cacheList.addAll(imgArray);
              // cacheList.remove(imagePth);
              setState(() {
                imgArray.remove(imagePth);
              });
            },
            child: ClipOval(
              child: Container(
                color: Colors.white.withOpacity(0.7),
                width: 20,
                height: 20,
                child: Icon(
                  Icons.close,
                  size: 20,
                ),
              ),
            ),
          ),
        ),
      ],
    );
  }

  _showSheetAction() {
    showModalBottomSheet(
        context: context,
        builder: (context) => Container(
            height: 120,
            child: Column(
              children: [
                Expanded(
                  child: FlatButton(
                      onPressed: () {
                        pickImage(type: ImageSource.camera);
                      },
                      child: Container(
                        width: double.infinity,
                        height: double.infinity - 20,
                        child: Center(
                          child: Text('拍照'),
                        ),
                      )),
                ),
                Divider(
                  height: 5,
                ),
                Expanded(
                  child: FlatButton(
                      onPressed: () {
                        pickImage(type: ImageSource.gallery);
                      },
                      child: Container(
                        width: double.infinity,
                        height: double.infinity - 20,
                        color: Colors.white24,
                        child: Center(
                          child: Text('从相册选取'),
                        ),
                      )),
                )
              ],
            )));
  }
}

### 实现 `image_picker` 的多选图片功能 为了实现在 Flutter 应用中通过 `image_picker` 插件支持多选图片的功能,可以采用如下方案: #### 使用 `image_picker` 进行多图选择 虽然官方的 `image_picker` 不直接提供多选功能,但是可以通过多次调用单次选择的方法来模拟多选效果。不过更推荐的方式是使用专门针对多图选择设计的插件如 `multi_image_picker` 或者更新版本中的 `image_picker_multiple` 功能。 如果坚持要基于 `image_picker` 来实现,则需注意每次选取一张图片并将其存储到列表中直到用户完成所有图片的选择过程[^1]。 对于更加便捷的操作体验以及更好的性能表现,建议考虑第三方库比如 `multi_image_picker` 提供的支持多选的能力,这能简化开发流程并且提高用户体验度[^2]。 ```dart import 'package:image_picker/image_picker.dart'; import 'dart:io'; List<XFile> _selectedImages = []; void pickMultipleImages() async { final ImagePicker picker = ImagePicker(); try { List<XFile>? selectedFiles = await picker.pickMultiImage(); // 注意此方法可能不被旧版 image_picker 支持 if (selectedFiles != null && selectedFiles.isNotEmpty) { setState(() { _selectedImages.addAll(selectedFiles); }); } } catch (e) { print('Error while picking multiple images $e'); } } ``` 上述代码展示了如何利用 `pickMultiImage()` 方法一次性获取多个文件对象,并将它们加入已有的 `_selectedImages` 列表之中以便后续处理或展示。 需要注意的是,在实际应用时还需要考虑到权限管理、UI 更新逻辑等问题以确保整个交互流畅自然。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nicepainkiller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值