学习flutter-访问本地相册
1. 引入image_picker插件
flutter pub add image_picker
2. 创建组件
import 'package:image_picker/image_picker.dart';
class _SelectedImageState extends State<SelectedImage> {
// 实例化ImagePicker
final ImagePicker _picker = ImagePicker();
ImageProvider? _imageProvider;
XFile? pickedFile;
XFile? cameraImages;
// 打开相机
Future<void> _getCameraImage() async {
try {
cameraImages = await _picker.pickImage(source: ImageSource.camera, maxWidth: 800);
if (cameraImages != null) {
// 获取图像地址
_imageProvider = FileImage(File(cameraImages!.path));
} else {
_imageProvider = null;
}
setState(() {});
} catch (e) {
if (e is MissingPluginException) {
Toast.Show('当前平台不支持!');
} else {
Toast.Show('暂未开放相机权限');
}
}
}
// 打开相册
Future<void> _getImage() async {
try {
pickedFile = await _picker.pickImage(source: ImageSource.gallery, maxWidth: 800);
if (pickedFile != null) {
// 获取图像地址
_imageProvider = FileImage(File(pickedFile!.path));
} else {
_imageProvider = null;
}
setState(() {});
} catch (e) {
if (e is MissingPluginException) {
Toast.Show('当前平台不支持!');
} else {
Toast.Show('暂未开放相册权限');
}
}
}
Widget build(BuildContext context) {
Widget showImage = Container(
width: 100,
height: 100,
decoration: BoxDecoration(
image: DecorationImage(
image: _imageProvider ?? AssetImage('assets/images/add.png')
)
)
)
return Semantics(
label: '上传图片',
child: GestureDetector(
onTap: _getImage,
child: showImage,
)
)
}
}
pickImage
源码
Future<XFile?> pickImage({
required ImageSource source,
double? maxWidth,
double? maxHeight,
int? imageQuality,
CameraDevice preferredCameraDevice = CameraDevice.rear,
}) {
if (imageQuality != null && (imageQuality < 0 || imageQuality > 100)) {
throw ArgumentError.value(
imageQuality, 'imageQuality', 'must be between 0 and 100');
}
if (maxWidth != null && maxWidth < 0) {
throw ArgumentError.value(maxWidth, 'maxWidth', 'cannot be negative');
}
if (maxHeight != null && maxHeight < 0) {
throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative');
}
return platform.getImage(
source: source,
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: imageQuality,
preferredCameraDevice: preferredCameraDevice,
);
}
-
required ImageSource source
:决定图片来源调用相册还是调用相机:ImageSource.gallery
:获取手机图库的所有图片进行选择ImageSource.camera
:调用摄像头拍摄一张图片并选择
-
double? maxWidth
:指定选择图片的最大宽度,若图片超过该宽度,将等比例缩小图片再返回,默认返回原始图片 -
double? maxHeight
:指定选择图片的最大高度,若图片超过该高度,将等比例缩小图片再返回,默认返回原始图片 -
int? imageQuality
:修改图片返回的质量(压缩),取值在0-100,越大返回图片的质量越高,默认为100,即原始图片 -
CameraDevice preferredCameraDevice:调用前置摄像头还是后置摄像头:
CameraDevice.rear
:调用前置摄像头(默认)CameraDevice.front
:调用后置摄像头