reason

修改上传视频逻辑

......@@ -114,6 +114,36 @@ class DioUtils {
}
}
// 数据返回格式统一,统一处理异常
Future<BaseEntity<T>> _upload<T>(
String method,
String url, {
Object? data,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
ProgressCallback? progressCallback,
Options? options,
}) async {
final Response<String> response = await _dio.post<String>(
url,
data: data,
queryParameters: queryParameters,
options: _checkOptions(method, options),
cancelToken: cancelToken,
onSendProgress: progressCallback,
);
try {
final String data = response.data.toString();
final bool isCompute = !Constant.isDriverTest && data.length > 10 * 1024;
final Map<String, dynamic> map =
isCompute ? await compute(parseData, data) : parseData(data);
return BaseEntity<T>.fromJson(map);
} catch (e) {
debugPrint(e.toString());
return BaseEntity<T>(ExceptionHandle.parse_error, '数据解析错误!', null);
}
}
Options _checkOptions(String method, Options? options) {
options ??= Options();
options.method = method;
......@@ -178,6 +208,41 @@ class DioUtils {
}
/// 统一处理(onSuccess返回T对象,onSuccessList返回 List<T>)
void asyncUploadFile<T>(
Method method,
String url, {
NetSuccessCallback<T?>? onSuccess,
NetErrorCallback? onError,
Object? params,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
ProgressCallback? progressCallback,
Options? options,
}) {
Stream.fromFuture(_upload<T>(
method.value,
url,
data: params,
queryParameters: queryParameters,
options: options,
cancelToken: cancelToken,
progressCallback: progressCallback,
)).asBroadcastStream().listen((result) {
if (result.code == 0) {
if (onSuccess != null) {
onSuccess(result.data);
}
} else {
_onError(result.code, result.message, onError);
}
}, onError: (dynamic e) {
_cancelLogPrint(e, url);
final NetError error = ExceptionHandle.handleException(e);
_onError(error.code, error.msg, onError);
});
}
/// 统一处理(onSuccess返回T对象,onSuccessList返回 List<T>)
void asyncRequestNetwork<T>(
Method method,
String url, {
......
......@@ -14,6 +14,7 @@ import 'package:Parlando/routers/routers.dart';
import 'package:Parlando/widgets/my_app_bar.dart';
import 'package:Parlando/extension/int_extension.dart';
import 'package:getwidget/getwidget.dart';
import 'package:path_provider/path_provider.dart';
import '../poem_router.dart';
......@@ -36,13 +37,14 @@ class PoemPublish extends StatefulWidget {
class PoemPublishState extends State<PoemPublish> {
bool isPublishing = false;
bool isUploading = false;
String _langSortName = "普通话";
int _langSortId = 1; //TODO 传入服务器的口音ID
String _address = '我在此地';
String _longitude = "";
String _latitude = "";
final LangSortProvider _provider = LangSortProvider();
final ValueNotifier<double> _counter = ValueNotifier<double>(0.0);
final TextEditingController _msgController = TextEditingController();
@override
......@@ -52,8 +54,9 @@ class PoemPublishState extends State<PoemPublish> {
@override
void dispose() {
super.dispose();
_counter.dispose();
_provider.dispose();
super.dispose();
}
@override
......@@ -203,6 +206,16 @@ class PoemPublishState extends State<PoemPublish> {
color: Colors.black54, fontSize: 15.px),
),
),
Gaps.vGap10,
isUploading
? Padding(
padding: const EdgeInsets.all(20),
child: ValueListenableBuilder<double>(
builder: _buildWithValue,
valueListenable: _counter,
),
)
: Container(),
],
),
),
......@@ -222,6 +235,21 @@ class PoemPublishState extends State<PoemPublish> {
);
}
Widget _buildWithValue(BuildContext context, double value, Widget? child) {
return GFProgressBar(
percentage: value,
lineHeight: 10,
alignment: MainAxisAlignment.spaceBetween,
backgroundColor: Colors.black26,
progressBarColor: GFColors.INFO,
child: Text(
"${(value * 100).toStringAsFixed(1)}%",
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 8, color: Colors.white),
),
);
}
Future<dynamic> _getUploadVideo() async {
final directory = await getApplicationDocumentsDirectory();
dynamic video = await MultipartFile.fromFile(
......@@ -237,6 +265,7 @@ class PoemPublishState extends State<PoemPublish> {
}
isPublishing = true;
isUploading = true;
setState(() {});
_getUploadVideo().then((value) {
......@@ -244,14 +273,17 @@ class PoemPublishState extends State<PoemPublish> {
"video": value,
};
FormData formData = FormData.fromMap(map);
DioUtils.instance.asyncRequestNetwork<UploadEntity>(
DioUtils.instance.asyncUploadFile<UploadEntity>(
Method.post,
HttpApi.uploadVideo,
params: formData,
progressCallback: (int count, int data) {
_counter.value = count / data;
},
onSuccess: (data) {
String path = data!.data!.relativePath!;
String videoId = '${widget.id}';
isUploading = false;
Map<String, String> params = <String, String>{
"item_id": videoId,
"item_url": path,
......
......@@ -9,10 +9,10 @@ class AddressSelectPage extends StatefulWidget {
const AddressSelectPage({Key? key}) : super(key: key);
@override
_AddressSelectPageState createState() => _AddressSelectPageState();
AddressSelectPageState createState() => AddressSelectPageState();
}
class _AddressSelectPageState extends State<AddressSelectPage> {
class AddressSelectPageState extends State<AddressSelectPage> {
List<PoiSearch> _list = [];
int _index = 0;
final ScrollController _controller = ScrollController();
......
......@@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+5
version: 1.0.0+6
environment:
sdk: ">=2.16.2 <3.0.0"
......