1.使用multi_image_picker插件
//选择图片
openPhotoSelect(int maxImages,context) async {
try {
List<Asset> images = await MultiImagePicker.pickImages(
maxImages: maxImages - state.selectImageList.length,
enableCamera: true,
cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
materialOptions: MaterialOptions(
actionBarTitle: "图片选择",
allViewTitle: "所有图片",
useDetailsView: true,
selectCircleStrokeColor: "#4dc8b6",
selectionLimitReachedText: "最多选择$maxImages张图片",
),
);
state.selectImageList.addAll(file);
state.publishType = 1;
update();
} on Exception catch (e) {
print(e);
}
}
//选择的图片显示
AssetThumb(
asset: asset,
width: 105,
height: 105,
)
//上传图片
Future<bool> uploadImagesData() async {
state.imageVideoParamList.clear();
ByteData byteData;
List<int> imageData;
MultipartFile multipartFile;
FormData formData;
Response response;
Dio dio = Dio();
if(state.selectImageList.length > 0){
for (int i = 0; i < state.selectImageList.length; i++) {
Asset asset = state.selectImageList[i];
byteData = await asset.getByteData();
imageData = byteData.buffer.asUint8List();
multipartFile =
MultipartFile.fromBytes(imageData, filename: "${asset.name}");
formData = FormData.fromMap({
"android": "1",
"file": multipartFile,
});
response = await dio.post('${MyApi.UPLOAD_FILE}', data: formData);
if (response.statusCode == 200 && response.data['code'] == 200) {
state.uploadIndex = i + 1;
if (i == 0) {
state.image = response.data['data'] /*+
'?Size=${asset.originalWidth}x${asset.originalHeight}'*/;
state.imageVideoParamList.add(
{
'type':'P',
'url':'${response.data['data'] +
'?Size=${asset.originalWidth}x${asset.originalHeight}'}'
}
);
update();
} else {
state.image = "${state.image};" +
response.data['data'] +
'?Size=${asset.originalWidth}x${asset.originalHeight}';
state.imageVideoParamList.add(
{
'type':'P',
'url':'${response.data['data'] +
'?Size=${asset.originalWidth}x${asset.originalHeight}'}'
});
update();
}
}
}
// 图片上传结束
if (state.selectImageList.length > state.uploadIndex) {
// 部分图片上传失败
state.uploadIndex = null;
return false;
}
}
return true;
}
2.使用wechat_assets_picker插件
// 打开图片选择
openPhotoSelect(int maxImages,context) async {
try {
List<AssetEntity> images = await AssetPicker.pickAssets(
context,
maxAssets: maxImages - state.selectImageList.length
);
images.forEach((element) async {
File file = await element.file;
state.selectImageList.add(file);
});
state.publishType = 1;
update();
} on Exception catch (e) {
print(e);
}
}
//选择的图片的显示(加透明度渐变动画)
Image(
width: 105,
height: 105,
cacheWidth: 105,
cacheHeight: 105,
image: AssetEntityImageProvider(assetEntity, isOriginal: false),
fit: BoxFit.fill,
frameBuilder: (context, child, frame, wasSynchronouslyLoaded){
if(wasSynchronouslyLoaded){
return child;
}
return AnimatedOpacity(
child: child,
opacity: frame == null ? 0 : 1,
duration: const Duration(seconds: 4),
curve: Curves.easeOut,
);
}
)
//选择的图片的显示(wechat_assets_picker插件提供的方法)
/*Image(
width: 105,
height: 105,
image: AssetEntityImageProvider(assetEntity, isOriginal: false),
fit: BoxFit.fill,*/
//上传图片
Future<bool> uploadImagesData() async {
state.imageVideoParamList.clear();
ByteData byteData;
List<int> imageData;
MultipartFile multipartFile;
FormData formData;
Response response;
Dio dio = Dio();
if(state.selectImageList.length > 0){
for (int i = 0; i < state.selectImageList.length; i++) {
File file = state.selectImageList[i];
String imageName = file.path.substring(file.path.lastIndexOf("/") + 1, file.path.length);
multipartFile =
MultipartFile.fromFileSync(file.path, filename: "$imageName");
formData = FormData.fromMap({
"android": "1",
"file": multipartFile,
});
response = await dio.post('${MyApi.UPLOAD_FILE}', data: formData);
if (response.statusCode == 200 && response.data['code'] == 200) {
state.uploadIndex = i + 1;
if (i == 0) {
state.image = response.data['data'];
state.imageVideoParamList.add(
{
'type':'P',
'url':'${response.data['data']}'
}
);
update();
} else {
state.image = "${state.image};" +
response.data['data'];
state.imageVideoParamList.add(
{
'type':'P',
'url':'${response.data['data']}'
});
update();
}
}
}
// 图片上传结束
if (state.selectImageList.length > state.uploadIndex) {
// 部分图片上传失败
state.uploadIndex = null;
return false;
}
}
return true;
}
选择视频
/// 视频选择
void openVideoSelect(BuildContext context) async {
PickedFile pickedFile =
await ImagePicker().getVideo(source: ImageSource.gallery);
File videoFile = File(pickedFile.path);
//state.videoPath = videoFile.path;
update();
VideoPlayerController _controller = VideoPlayerController.file(videoFile);
_controller.initialize().then((_) async {
Duration duration = _controller.value.duration;
if (duration.inSeconds > 60) {
esLoadingToast('发布视频长度不能大于1分钟');
} else {
// 解码视频
Loading.showLoading(context);
bool end = await openVideoEncode(videoFile.path);
if(end){
Loading.hideLoading(context);
}
}
});
}