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
更多关于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_STORAGE
和 WRITE_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()