Flutter图片选择插件adv_image_picker的使用

Flutter图片选择插件adv_image_picker的使用

这是我的自定义图片选择器,它允许你多选图片并使用我们的自定义UI。

注意:此插件仍在开发中,某些组件可能尚未可用或仍存在许多错误。

安装

首先,在你的 pubspec.yaml 文件中添加 adv_image_picker 作为依赖项。

dependencies:
  adv_image_picker: ^1.0.6

说明

如果你打算加载缩略图大小的图片,建议从 AdvImagePickerPlugin.getThumbnail 获取图片字节。否则,可能会导致内存问题。

示例

你可以在这里找到完整的示例代码:此处

示例代码

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:adv_image_picker/adv_image_picker.dart';
import 'package:adv_image_picker/plugins/adv_image_picker_plugin.dart';
import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // CustomImageCache();
  runApp(MyApp());
}

// 自定义图片缓存类
class CustomImageCache extends WidgetsFlutterBinding {
  [@override](/user/override)
  ImageCache createImageCache() {
    ImageCache imageCache = super.createImageCache();
    // 设置你的图片缓存大小
    imageCache.maximumSize = 10;
    return imageCache;
  }
}

class MyApp extends StatelessWidget {
  // 这个小部件是你的应用的根
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: '图片选择器演示首页'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<File> files = []; // 存储选择的文件
  List<ImageProvider> thumbnails = []; // 存储缩略图
  bool isPreparing = false; // 是否正在准备数据

  [@override](/user/override)
  void initState() {
    super.initState();

    AdvImagePicker.cameraFolderName = "相机文件夹";
    AdvImagePicker.cameraFilePrefixName = "相机测试前缀名_";
    AdvImagePicker.cameraSavePath = "/storage/emulated/0/相机测试文件夹/";
  }

  [@override](/user/override)
  void dispose() {
    // 清理之前占用的内存
    if ((thumbnails.length) > 0) {
      for (ImageProvider each in thumbnails) {
        each.evict();
      }
    }

    super.dispose();
  }

  void _pickImage() async {
    final result = await AdvImagePicker.pickImagesToFile(
          context,
        ) ??
        [];
    files.addAll(result);
    print("files => ${files.map((e) => e.path).join("\n")}");
    print("size of files => ${files.map((e) => e.lengthSync()).join("\n")}");
    prepare();
  }

  Future<void> prepare() async {
    List<ImageProvider> thumbnails = [];
    double screenWidth = MediaQuery.of(context).size.width;

    for (int i = 0; i < files.length; i++) {
      String path = files[i].path;
      ByteData data = await AdvImagePickerPlugin.getAlbumThumbnail(
        imagePath: path,
        height: screenWidth ~/ 4,
        width: screenWidth ~/ 4,
      );

      Uint8List imageData = data.buffer.asUint8List();

      thumbnails.add(MemoryImage(imageData));
    }

    this.thumbnails = List<ImageProvider>.from(thumbnails);

    if (this.mounted) setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: isPreparing
            ? CircularProgressIndicator()
            : GridView.count(
                crossAxisCount: 4,
                children: thumbnails
                    .map((ImageProvider image) => Image(
                          image: image,
                          fit: BoxFit.cover,
                        ))
                    .toList(),
              ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _pickImage,
        child: Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


adv_image_picker 是一个用于在 Flutter 应用中实现图片选择功能的插件。它提供了从相册中选择图片、拍摄照片、裁剪图片等功能。以下是使用 adv_image_picker 插件的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  adv_image_picker: ^0.5.0  # 请检查最新版本

然后运行 flutter pub get 以获取依赖。

2. 导入包

在你的 Dart 文件中导入 adv_image_picker 包:

import 'package:adv_image_picker/adv_image_picker.dart';

3. 初始化插件

在使用 adv_image_picker 之前,通常需要初始化插件:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AdvImagePicker.initialize();
  runApp(MyApp());
}

4. 使用插件选择图片

你可以使用 AdvImagePicker.pickImage 方法来选择图片。以下是一个简单的示例:

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> {
  File? _image;

  Future<void> _pickImage() async {
    try {
      final result = await AdvImagePicker.pickImage(
        maxWidth: 800,
        maxHeight: 800,
        quality: 80,
      );

      if (result != null) {
        setState(() {
          _image = File(result.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: _image == null
            ? Text('No image selected.')
            : Image.file(_image!),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _pickImage,
        tooltip: 'Pick Image',
        child: Icon(Icons.add_a_photo),
      ),
    );
  }
}

5. 处理裁剪功能

adv_image_picker 还支持图片裁剪功能。你可以通过设置 crop 参数来启用裁剪:

final result = await AdvImagePicker.pickImage(
  maxWidth: 800,
  maxHeight: 800,
  quality: 80,
  crop: true,  // 启用裁剪
);

6. 处理多张图片选择

如果你需要选择多张图片,可以使用 pickMultipleImages 方法:

final results = await AdvImagePicker.pickMultipleImages(
  maxWidth: 800,
  maxHeight: 800,
  quality: 80,
);

if (results != null) {
  setState(() {
    _images = results.map((result) => File(result.path)).toList();
  });
}

7. 处理权限

在使用 adv_image_picker 时,确保你已经处理了必要的权限。通常需要处理 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限。

import 'package:permission_handler/permission_handler.dart';

Future<void> _checkPermissions() async {
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    await Permission.storage.request();
  }
}

// 在 pickImage 之前调用 _checkPermissions()
回到顶部