使用Flutter进行应用开发时,经常会遇到选图、拍照等需求。如果要求不高,Flutter图库选择可以使用官方提供的image_picker,如果需要多选,那么可以使用multi_image_picker插件库。multi_image_picker库支持图库管理,多选,拍照,当然还可以自定义资源管理界面。
multi_image_picker的使用也比较简单,首先,需要在pubspec.yaml配置文件中添加multi_image_picker库的依赖,如下所示。
dependencies:
dio: ^3.0.9
multi_image_picker: ^4.7.10
然后,我们编写逻辑代码,如下所示。
openMultiPhoto() async {
List<Asset> assets = await MultiImagePicker.pickImages(
maxImages: 9,
enableCamera: true,
materialOptions:MaterialOptions(
startInAllView:true,
allViewTitle:'所有照片',
actionBarColor:'#2196F3',
textOnNothingSelected:'没有选择照片'
),
);
if (assets != null && assets.length > 0) {
for (int i = 0; i < assets.length; i ++) {
Asset asset = assets[i];
uploadFile(asset);
};
}
}
//上传服务器
uploadFile(image) async {
ByteData data =await image.getByteData();
final buffer = data.buffer;
FormData form =FormData.fromMap({
//后端接口的参数名称
'name': image.name,
'file':MultipartFile.fromBytes(buffer.asUint8List(data.offsetInBytes, data.lengthInBytes)),
});
String serverPath='';
//其他上传参数
Map<String, dynamic> params = Map();
await Dio().post(serverPath, data: form,queryParameters: params);
}
//ByteData转换成File
Future<void> writeToFile(ByteData data, String path) {
final buffer = data.buffer;
return File(path).writeAsBytes(
buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
}
然后,我们做一个测试的按钮,代码如下。
MyButton(text: '多图片选择', btnColors: Colors.blue,
onPressed: () {
openMultiPhoto();
}, )