You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
6.9 KiB
213 lines
6.9 KiB
import 'dart:io'; |
|
|
|
import 'package:dio/dio.dart'; |
|
import 'package:flutter/cupertino.dart'; |
|
import 'package:flutter/material.dart'; |
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; |
|
import 'package:image_pickers/image_pickers.dart'; |
|
import 'package:shared_preferences/shared_preferences.dart'; |
|
import 'package:thumbnails/thumbnails.dart'; |
|
|
|
import '../community/release_dynamic.dart'; |
|
import '../retrofit/data/base_data.dart'; |
|
import '../retrofit/data/upload_result.dart'; |
|
import '../retrofit/retrofit_api.dart'; |
|
import '../view_widget/custom_image.dart'; |
|
import 'font_weight.dart'; |
|
|
|
class UploadAsync { |
|
static void upload(int dynamicType, List<Medias> mediaPaths, |
|
String addressText, String dynamicText) async { |
|
SmartDialog.show( |
|
widget: Container( |
|
alignment: Alignment.centerRight, |
|
margin: EdgeInsets.only( |
|
right: 10.w, |
|
), |
|
child: Stack( |
|
alignment: Alignment.center, |
|
children: [ |
|
Container( |
|
width: 50.h, |
|
height: 70.h, |
|
decoration: BoxDecoration( |
|
color: Colors.grey, borderRadius: BorderRadius.circular(2)), |
|
child: dynamicType == 0 |
|
? Expanded(child: Column( |
|
children: [ |
|
Text( |
|
dynamicText, |
|
maxLines: 5, |
|
overflow: TextOverflow.ellipsis, |
|
style: TextStyle( |
|
fontWeight: MyFontWeight.semi_bold, |
|
fontSize: dynamicText.length > 10 ? (dynamicText.length > 20?8.sp:10.sp):15.sp, |
|
color: Color(0xFFCDCCCC), |
|
), |
|
), |
|
Expanded(child: |
|
Container( |
|
height: 20.h, |
|
)) |
|
])) |
|
: ClipRRect( |
|
borderRadius: BorderRadius.circular(2), |
|
child: Image.file( |
|
File(mediaPaths[0].galleryMode == GalleryMode.video |
|
? mediaPaths[0].thumbPath |
|
: mediaPaths[0].path), |
|
fit: BoxFit.cover, |
|
width: double.infinity, |
|
height: double.infinity, |
|
), |
|
), |
|
), |
|
CircularProgressIndicator( |
|
strokeWidth: 3.0, |
|
backgroundColor: Colors.white, |
|
// value: 0.4, |
|
valueColor: new AlwaysStoppedAnimation<Color>(Colors.grey), |
|
), |
|
], |
|
), |
|
), |
|
maskWidgetTemp: SizedBox(), |
|
); |
|
var sp = await SharedPreferences.getInstance(); |
|
ApiService apiService = ApiService( |
|
Dio(), |
|
token: sp.getString("token"), |
|
showLoading: false, |
|
); |
|
|
|
fileUpload(apiService, mediaPaths, dynamicType).then((value) async { |
|
String subjectType = "text"; |
|
if (dynamicType == 0) { |
|
subjectType = "text"; |
|
} else if (dynamicType == 1) { |
|
subjectType = "image"; |
|
} else if (dynamicType == 2) { |
|
subjectType = "video"; |
|
} |
|
|
|
List<String> remoteImageUrls = []; |
|
String remoteVideoUrl = ""; |
|
String remoteVideoCoverImg = ""; |
|
if (mediaPaths.length > 0) { |
|
if (dynamicType == 1) { |
|
remoteImageUrls = mediaPaths.map((e) => e.remotePath).toList(); |
|
} else if (dynamicType == 2) { |
|
remoteVideoUrl = mediaPaths[0].remotePath; |
|
remoteVideoCoverImg = mediaPaths[0].thumbPath; |
|
} |
|
} |
|
|
|
BaseData<bool> baseData = await apiService.trend({ |
|
"images": remoteImageUrls, |
|
"subject": dynamicText, |
|
"subjectType": subjectType, |
|
"video": remoteVideoUrl, |
|
"coverImg": remoteVideoCoverImg, |
|
"latitude": "", |
|
"location": addressText, |
|
"longitude": "", |
|
}).catchError((onError) { |
|
SmartDialog.dismiss(); |
|
}); |
|
if (baseData != null && baseData.isSuccess) { |
|
SmartDialog.showToast("发布成功!"); |
|
UploadInstance.instance.notifyAllObservers(); |
|
} else { |
|
SmartDialog.showToast(baseData.msg, alignment: Alignment.center); |
|
} |
|
SmartDialog.dismiss(); |
|
}); |
|
} |
|
|
|
///文件上传 |
|
static Future<void> fileUpload( |
|
ApiService apiService, List<Medias> mediaPaths, int dynamicType) async { |
|
if (mediaPaths != null && mediaPaths.length > 0) { |
|
await Future.forEach(mediaPaths, (element) async { |
|
if ((element.remotePath == null || element.remotePath == "") && |
|
(element != null && |
|
element.path != null && |
|
element.path != "" && |
|
await File(element.path).exists())) { |
|
File file = File(element.path); |
|
if (dynamicType == 2) { |
|
String thumbnail; |
|
if (element.thumbPath != null && |
|
element.thumbPath != "" && |
|
await File(element.thumbPath).exists()) { |
|
thumbnail = element.thumbPath; |
|
} else { |
|
thumbnail = await Thumbnails.getThumbnail( |
|
videoFile: file.path, |
|
imageType: ThumbFormat.JPEG, |
|
quality: 10, |
|
); |
|
} |
|
if (thumbnail != null && |
|
thumbnail != "" && |
|
await File(thumbnail).exists()) { |
|
BaseData<UploadResult> baseData = await apiService.upload( |
|
File(thumbnail), 123123123, dynamicType == 2); |
|
if (baseData != null && baseData.isSuccess) { |
|
UploadResult uploadResult = baseData.data; |
|
mediaPaths[mediaPaths.indexOf(element)].thumbPath = |
|
uploadResult.url; |
|
} |
|
} |
|
} |
|
BaseData<UploadResult> baseData = |
|
await apiService.upload(file, 123123123, dynamicType == 2); |
|
if (baseData != null && baseData.isSuccess) { |
|
UploadResult uploadResult = baseData.data; |
|
mediaPaths[mediaPaths.indexOf(element)].remotePath = |
|
uploadResult.url; |
|
} |
|
} |
|
}); |
|
} |
|
} |
|
} |
|
|
|
abstract class UploadObserver { |
|
void onUploadFinish(); |
|
} |
|
|
|
class UploadInstance { |
|
factory UploadInstance() => _getInstance(); |
|
|
|
static UploadInstance get instance => _getInstance(); |
|
|
|
static UploadInstance _instance; |
|
|
|
List<UploadObserver> _uploadObserverList; |
|
|
|
List<UploadObserver> get uploadObserverList => _uploadObserverList; |
|
|
|
set uploadObserverList(List<UploadObserver> value) { |
|
_uploadObserverList = value; |
|
} |
|
|
|
UploadInstance._internal() { |
|
//单例初始化 |
|
_uploadObserverList = []; |
|
} |
|
|
|
static UploadInstance _getInstance() { |
|
if (_instance == null) { |
|
_instance = UploadInstance._internal(); |
|
} |
|
return _instance; |
|
} |
|
|
|
void notifyAllObservers() { |
|
_uploadObserverList.forEach((element) { |
|
element.onUploadFinish(); |
|
}); |
|
} |
|
}
|
|
|