Flutter图片选择器插件images_picker_ux的使用

Flutter图片选择器插件images_picker_ux的使用

概述

images_picker 是一个用于从 Android 和 iOS 图库中选择图片或视频,并支持通过相机拍摄图片或视频的 Flutter 插件。此外,它还提供了裁剪、压缩等功能。

功能支持

  • 从相册中选择多张图片或视频(微信风格)。
  • 使用相机拍摄图片或视频。
  • 自定义裁剪图片。
  • 压缩图片(根据质量和大小限制)。
  • 将图片或视频保存到相册或图库。
  • 支持的语言包括系统语言、中文、繁体中文、英语、日语、法语、韩语、德语和越南语。

安装

iOS 配置

Info.plist 文件中添加以下权限描述:

<key>NSCameraUsageDescription</key>
<string>Example usage description</string>
<key>NSMicrophoneUsageDescription</key>
<string>Example usage description</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Example usage description</string>

Android 配置

android/app/build.gradle 中设置最低 SDK 版本为 21:

minSdkVersion 21

pubspec.yaml 中添加依赖:

dependencies:
  images_picker: ^1.2.10

导入插件:

import 'package:images_picker/images_picker_ux.dart';

使用方法

1. 简单选择图片

Future<void> getImage() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3, // 选择图片数量
    pickType: PickType.image, // 选择类型为图片
  );
  
  // Media 提供的属性:
  // .path: 图片路径
  // .thumbPath: 视频缩略图路径
  // .size: 文件大小(KB)
}

2. 简单选择视频

Future<void> getVideo() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3, // 选择视频数量
    pickType: PickType.video, // 选择类型为视频
  );
  
  // Media 提供的属性:
  // .path: 视频路径
  // .thumbPath: 视频缩略图路径
  // .size: 文件大小(KB)
}

3. 打开相机

Future<void> openCamera() async {
  List<Media> res = await ImagesPicker.openCamera(
    pickType: PickType.image, // 拍摄类型为图片
    maxTime: 15, // 录制视频的最大时长(秒)
  );

  // Media 提供的属性:
  // .path: 图片或视频路径
  // .thumbPath: 视频缩略图路径
  // .size: 文件大小(KB)
}

4. 添加 GIF 支持

Future<void> pickWithGif() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    gif: true, // 启用 GIF 支持
  );
}

5. 设置最大视频录制时间

Future<void> pickWithMaxTime() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.video,
    maxTime: 30, // 最大录制时间为 30 秒
  );
}

6. 添加裁剪功能

Future<void> pickWithCrop() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    cropOpt: CropOption(
      cropType: CropType.rect, // 裁剪类型为矩形
    ),
  );
}

7. 添加压缩功能

Future<void> pickWithCompress() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    quality: 0.8, // 压缩质量(仅适用于 Android)
    maxSize: 500, // 压缩后文件大小(仅适用于 iOS,单位 KB)
  );
}

8. 设置语言

Future<void> pickWithLanguage() async {
  List<Media> res = await ImagesPicker.pick(
    language: Language.Chinese, // 设置语言为中文
  );
}

9. 保存文件到相册

本地文件保存

Future<void> saveToLocal() async {
  File file = File("/path/to/your/image.png"); // 替换为实际文件路径
  bool status = await ImagesPicker.saveImageToAlbum(file);
  print(status); // 是否保存成功
}

网络文件保存

Future<void> saveFromNetwork() async {
  File file = await downloadFile("https://example.com/image.png");
  bool status = await ImagesPicker.saveImageToAlbum(file);
  print(status); // 是否保存成功
}

Future<File> downloadFile(String url) async {
  Dio dio = Dio();
  String savePath = "${Directory.systemTemp.path}/${url.split('/').last}";
  await dio.download(url, savePath);
  return File(savePath);
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 images_picker 插件进行图片和视频的选择、裁剪、保存等操作。

import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:images_picker/images_picker_ux.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? path;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('images_picker 示例'),
        ),
        body: Column(
          children: [
            ElevatedButton(
              child: Text('选择图片'),
              onPressed: () async {
                List<Media>? res = await ImagesPicker.pick(
                  count: 3,
                  pickType: PickType.image,
                  language: Language.System,
                  maxTime: 30,
                  cropOpt: CropOption(
                    cropType: CropType.circle,
                  ),
                );
                if (res != null) {
                  print(res.map((e) => e.path).toList());
                  setState(() {
                    path = res[0].thumbPath;
                  });
                }
              },
            ),
            ElevatedButton(
              child: Text('打开相机'),
              onPressed: () async {
                List<Media>? res = await ImagesPicker.openCamera(
                  pickType: PickType.image,
                  quality: 0.8,
                  maxSize: 800,
                  maxTime: 15,
                );
                if (res != null) {
                  setState(() {
                    path = res[0].thumbPath;
                  });
                }
              },
            ),
            ElevatedButton(
              onPressed: () async {
                File file = await downloadFile('https://cdn.chavesgu.com/logo.png');
                bool res = await ImagesPicker.saveImageToAlbum(file);
                print(res);
              },
              child: Text('保存网络图片到相册'),
            ),
            ElevatedButton(
              onPressed: () async {
                File file = await downloadFile('https://cdn.chavesgu.com/SampleVideo.mp4');
                bool res = await ImagesPicker.saveVideoToAlbum(file);
                print(res);
              },
              child: Text('保存网络视频到相册'),
            ),
            path != null
                ? Container(
                    height: 200,
                    child: Image.file(
                      File(path!),
                      fit: BoxFit.contain,
                    ),
                  )
                : SizedBox.shrink(),
          ],
        ),
      ),
    );
  }

  Future<File> downloadFile(String url) async {
    Dio dio = Dio();
    String savePath = "${Directory.systemTemp.path}/${url.split('/').last}";
    await dio.download(url, savePath);
    print(savePath);
    return File(savePath);
  }
}

参数说明

以下是 ImagesPicker.pick 的所有参数说明:

int count = 1,
PickType pickType = PickType.image,
bool gif = true,
int maxTime = 120,
CropOption cropOpt,
int maxSize,
double quality,

ProGuard 配置

在 Android 项目中,如果遇到混淆问题,请添加以下规则:

-keep class com.luck.picture.lib.** { *; }

-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }

更多关于Flutter图片选择器插件images_picker_ux的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片选择器插件images_picker_ux的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


images_picker_ux 是一个用于 Flutter 的图片选择器插件,它允许用户从相册中选择图片或拍摄新照片。以下是如何使用 images_picker_ux 插件的详细步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 images_picker_ux 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  images_picker_ux: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 images_picker_ux 插件:

import 'package:images_picker_ux/images_picker_ux.dart';

3. 使用图片选择器

你可以使用 ImagesPickerUx 类来打开图片选择器并获取用户选择的图片。

以下是一个简单的示例,展示如何从相册中选择图片或拍摄新照片:

import 'package:flutter/material.dart';
import 'package:images_picker_ux/images_picker_ux.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImagePickerExample(),
    );
  }
}

class ImagePickerExample extends StatefulWidget {
  @override
  _ImagePickerExampleState createState() => _ImagePickerExampleState();
}

class _ImagePickerExampleState extends State<ImagePickerExample> {
  String? _imagePath;

  Future<void> _pickImage() async {
    try {
      final imagePicker = ImagesPickerUx();
      final image = await imagePicker.pickImage(source: ImageSource.gallery);

      if (image != null) {
        setState(() {
          _imagePath = image.path;
        });
      }
    } catch (e) {
      print("Error picking image: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imagePath != null
                ? Image.file(File(_imagePath!))
                : Text('No image selected.'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image from Gallery'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 处理权限

在 Android 和 iOS 上,访问相册和相机需要相应的权限。确保在 AndroidManifest.xmlInfo.plist 中添加必要的权限。

Android

android/app/src/main/AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

iOS

ios/Runner/Info.plist 中添加以下权限:

<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to your photo library to select images.</string>
<key>NSCameraUsageDescription</key>
<string>We need access to your camera to take photos.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone to record videos.</string>
回到顶部