我们在上一章回中介绍了"如何播放视频"相关的内容,本章回中将介绍如何选择单个图片文件.闲话休提,让我们一起Talk Flutter吧。
我们在前面章回中介绍了加载本地图片和播放视频相关的内容,它们需要获取文件在本地存储的绝对路径,我们在很早的章回中介绍过path_provider包,它可以协助开
发者获取到本地存储的路径,不过没有可以视化的界面操作,本章回中将介绍一种通过可视化操作获取文件路径的方法,并且在此基础上获取图片文件。
我们通过三方包image_picker来获取文件路径,而且是通过可视化操作的方式来获取文件,我们只需要发出一个指令就可以打开手机上的文件系统,接下来就可以在该
文件系统中以可视化的方式选择文件,选择文件后可以获取到该文件在文件系统中的绝对路径。这个包是Flutter官方提供的包,我们可以放心使用,而且在Android系
统中不需要获取文件读写权限(早期版本需要,最新版本不需要,具体的版本号可以参考官方文档).我们在接下来的章回中将详细介绍该包的使用方法,包含获取图片文件
和视频文件,以及通过相机来获取图片和视频文件。
介绍完具体的实现思路后,我们介绍详细的实现方法。
Future<XFile?>
类型的对象,因此我们需要在Future的then方法来获取文件路径。此ImagePicker imagePicker = ImagePicker();
XFile? _mediaFile;
double imgWidth = 200;
double imgHeight = 400;
///注意获取图片需要异步操作
Future<XFile?> getImageFile() async {
var imgFile = await imagePicker.pickImage(
source: ImageSource.gallery,
maxWidth: imgWidth,
maxHeight: imgHeight,
imageQuality: 10,
);
return imgFile;
}
///通过按钮来发出指令
ElevatedButton(
onPressed: () {
getImageFile().then((value) {
///因为是异步,所以需要通过setState更新数据源
setState(() {
///返回的路径是app下的缓冲目录:data/user/0/packagename/cache/scaled_1000000010.jpg
// debugPrint("path: v${value[0].path}");
_mediaFile = value;
});
});
},
child: const Text("Load Image"),
),
///显示图片文件
_mediaFile == null
? const Icon(Icons.image)
: (_mediaFile!.path.isEmpty
? const Text("do not select image")
: Image.file(
File(_mediaFile!.path),
width: imgWidth,
height: imgHeight,
errorBuilder: (context, error, trace) {
return Text("load image error: $error");
},
))
上面的示例代码中演示了如何获取图片文件,代码把pickImage()方法封装成了异步方法,并且将它绑定到按钮上,这样就可以在点击按钮时发出获取文件的指令,此时
会打开一个文件选择器的窗口,我们可以在该窗口中以可视化操作的方式选择图片文件。代码中加载图片前需要检查文件路径,文件路径在程序最开始运行时为null,在
程序运行后,但是没有选择任何图片文件,此时的文件路径不为空,而是为empty,这点需要特别注意,不然无法正确显示图片文件。此外,我们获取到的图片文件路径是
一个相对路径,它并不是图片文件的绝对路径。
最后,我们对本章回的内容做一个全面的总结: