Browse Source

[New]新增文件上传进度

zhipeng 1 year ago
parent
commit
2a030f5c06

+ 83 - 0
lib/data/api/atmob_file_api.c.dart

@@ -0,0 +1,83 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'atmob_file_api.dart';
+
+// **************************************************************************
+// RetrofitGenerator
+// **************************************************************************
+
+// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers
+
+class _AtmobFileApi implements AtmobFileApi {
+  _AtmobFileApi(
+    this._dio, {
+    this.baseUrl,
+  });
+
+  final Dio _dio;
+
+  String? baseUrl;
+
+  @override
+  Future<BaseResponse<TalkGenerateResponse>> uploadTalkFile(
+      Map<String, dynamic> body,
+      {ProgressCallback? onSendProgress}) async {
+    const _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = FormData.fromMap(body);
+    final _result = await _dio.fetch<Map<String, dynamic>>(
+        _setStreamType<BaseResponse<TalkGenerateResponse>>(Options(
+      method: 'POST',
+      headers: _headers,
+      extra: _extra,
+      contentType: 'multipart/form-data',
+    )
+            .compose(
+              _dio.options,
+              '/project/secretary/v1/talk/generate',
+              queryParameters: queryParameters,
+              data: _data,
+            )
+            .copyWith(
+                baseUrl: _combineBaseUrls(
+              _dio.options.baseUrl,
+              baseUrl,
+            ))));
+    final value = BaseResponse<TalkGenerateResponse>.fromJson(
+      _result.data!,
+      (json) => TalkGenerateResponse.fromJson(json as Map<String, dynamic>),
+    );
+    return value;
+  }
+
+  RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
+    if (T != dynamic &&
+        !(requestOptions.responseType == ResponseType.bytes ||
+            requestOptions.responseType == ResponseType.stream)) {
+      if (T == String) {
+        requestOptions.responseType = ResponseType.plain;
+      } else {
+        requestOptions.responseType = ResponseType.json;
+      }
+    }
+    return requestOptions;
+  }
+
+  String _combineBaseUrls(
+    String dioBaseUrl,
+    String? baseUrl,
+  ) {
+    if (baseUrl == null || baseUrl.trim().isEmpty) {
+      return dioBaseUrl;
+    }
+
+    final url = Uri.parse(baseUrl);
+
+    if (url.isAbsolute) {
+      return url.toString();
+    }
+
+    return Uri.parse(dioBaseUrl).resolveUri(url).toString();
+  }
+}

+ 3 - 2
lib/data/api/atmob_file_api.dart

@@ -6,7 +6,7 @@ import '../../base/base_response.dart';
 import '../consts/Constants.dart';
 import 'network_module.dart';
 
-part 'atmob_file_api.g.dart';
+part 'atmob_file_api.c.dart';
 
 @RestApi()
 abstract class AtmobFileApi {
@@ -15,7 +15,8 @@ abstract class AtmobFileApi {
   @MultiPart()
   @POST("/project/secretary/v1/talk/generate")
   Future<BaseResponse<TalkGenerateResponse>> uploadTalkFile(
-      @Part() Map<String, dynamic> body);
+      @Part() Map<String, dynamic> body,
+      {ProgressCallback? onSendProgress});
 }
 
 final atmobFileApi = AtmobFileApi(fileDio, baseUrl: Constants.baseUrl);

+ 25 - 7
lib/data/repositories/talk_repository.dart

@@ -6,6 +6,7 @@ import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_file_request.dart';
 import 'package:get/get.dart';
+
 import '../../utils/http_handler.dart';
 import '../api/request/talk_generate_request.dart';
 import '../api/request/talk_paginate_request.dart';
@@ -23,6 +24,8 @@ class TalkRepository {
 
   final Set<String> _uploadingTalkIds = {};
 
+  final Map<String, RxDouble> _uploadingTalkProgress = {};
+
   final _talkList = RxList<TalkBean>();
 
   RxList<TalkBean> get talkList => _talkList;
@@ -142,15 +145,30 @@ class TalkRepository {
   Future<String> uploadTalkFile(String talkId, double duration, File file) {
     _uploadingTalkIds.add(talkId);
     return atmobFileApi
-        .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson())
+        .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson(),
+            onSendProgress: (count, total) {
+          if (_uploadingTalkProgress[talkId] == null) {
+            _uploadingTalkProgress[talkId] = RxDouble(0);
+          } else {
+            _uploadingTalkProgress[talkId]!.value = count / total;
+          }
+        })
         .then(HttpHandler.handle(true))
         .then((response) {
-      _uploadingTalkIds.remove(talkId);
-      return response.taskId;
-    }).catchError((error) {
-      _uploadingTalkIds.remove(talkId);
-      throw error;
-    });
+          _uploadingTalkIds.remove(talkId);
+          return response.taskId;
+        })
+        .catchError((error) {
+          _uploadingTalkIds.remove(talkId);
+          throw error;
+        });
+  }
+
+  RxDouble getUploadProgress(String talkId) {
+    if (_uploadingTalkProgress[talkId] == null) {
+      _uploadingTalkProgress[talkId] = RxDouble(0);
+    }
+    return _uploadingTalkProgress[talkId]!;
   }
 }