Bladeren bron

[new]增加录音达限制时弹窗提醒

zk 11 maanden geleden
bovenliggende
commit
ab06ac1d90

+ 1 - 1
lib/data/consts/constants.dart

@@ -7,7 +7,7 @@ import '../../utils/common_utils.dart';
 class Constants {
   Constants._();
 
-  static const String env = envTest;
+  static const String env = envProd;
 
   static const String envDev = 'dev';
 

+ 6 - 3
lib/dialog/alert_dialog.dart

@@ -6,7 +6,10 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 
 class EAAlertDialog {
+  static const String tag = "EAAlertDialog";
+
   static Future<T?> show<T>({
+    String tag = tag,
     String? title,
     String? contentText,
     Widget? contentWidget,
@@ -27,14 +30,14 @@ class EAAlertDialog {
             confirmOnTap: confirmOnTap,
             cancelOnTap: cancelOnTap);
       },
-      tag: "EAAlertDialog",
+      tag: tag,
       onDismiss: onDismiss,
       clickMaskDismiss: false,
     );
   }
 
-  static void dismiss<T>({T? result}) {
-    SmartDialog.dismiss(tag: "EAAlertDialog", result: result);
+  static void dismiss<T>({T? result, String tag = tag}) {
+    SmartDialog.dismiss(tag: tag, result: result);
   }
 }
 

+ 58 - 0
lib/dialog/record_max_dialog.dart

@@ -0,0 +1,58 @@
+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 '../resource/colors.gen.dart';
+
+void showRecordMaxDialog(String contentTxt, {required String tag}) {
+  if (SmartDialog.checkExist(tag: tag)) {
+    return;
+  }
+  SmartDialog.show(
+      tag: tag,
+      builder: (_) {
+        return Container(
+          padding: EdgeInsets.all(16.w),
+          width: 280.w,
+          decoration: BoxDecoration(
+            color: Colors.white,
+            borderRadius: BorderRadius.circular(12),
+          ),
+          child: IntrinsicHeight(
+            child: Column(
+              children: [
+                SizedBox(height: 24.h),
+                Text(
+                  contentTxt,
+                  style: TextStyle(
+                      fontSize: 15.sp,
+                      color: ColorName.primaryTextColor,
+                      fontWeight: FontWeight.bold),
+                ),
+                SizedBox(height: 35.h),
+                GestureDetector(
+                  onTap: () {
+                    SmartDialog.dismiss();
+                  },
+                  child: Container(
+                    padding: EdgeInsets.symmetric(vertical: 8.h),
+                    decoration: BoxDecoration(
+                      color: ColorName.colorPrimary,
+                      borderRadius: BorderRadius.circular(8),
+                    ),
+                    child: Center(
+                      child: Text(
+                        '确定',
+                        style:
+                            TextStyle(fontSize: 16.sp, color: ColorName.white),
+                      ),
+                    ),
+                  ),
+                ),
+                SizedBox(height: 4.h),
+              ],
+            ),
+          ),
+        );
+      });
+}

+ 11 - 18
lib/module/record/record_handler.dart

@@ -23,6 +23,7 @@ import '../../data/consts/error_code.dart';
 import '../../data/consts/event_report_id.dart';
 import '../../data/repositories/talk_repository.dart';
 import '../../dialog/alert_dialog.dart';
+import '../../dialog/record_max_dialog.dart';
 import '../../resource/string.gen.dart';
 import '../../utils/http_handler.dart';
 import '../../utils/mmkv_util.dart';
@@ -64,9 +65,8 @@ class RecordHandler {
   String get lastRecordId => _lastRecordId ?? '';
   StreamSubscription? _currentDurationListener;
   StreamSubscription? _recordActionListener;
-  final int maxRecordDuration = 60 * 60 * 5 - 60; //最大录音时长5小时,减去1分钟以防止录音时长超过5小时
-  final int maxRecordSize =
-      1024 * 1024 * 1024 - 1024 * 1024; //最大录音文件1G,减去1M以防止录音文件超过1G
+  final int maxRecordDuration = 60 * 60 * 5; //最大录音时长5小时
+  final int maxRecordSize = 1024 * 1024 * 1024; //最大录音文件1G
   int currentRecordSize = 0;
 
   void init() {
@@ -275,24 +275,24 @@ class RecordHandler {
       if (data.isEmpty) {
         return;
       }
-      if (currentDuration.value >= maxRecordDuration) {
-        ToastUtil.showToast("录音时长已达上限");
+      var nowTime = _getPcmDuration(
+          data.length, recordConfig.sampleRate, 16, recordConfig.numChannels);
+      if (currentDuration.value + nowTime >= maxRecordDuration) {
+        showRecordMaxDialog("录音时长已达上限", tag: "recordMaxDialog");
         stopRecord();
         return;
       }
-      if (currentRecordSize >= maxRecordSize) {
-        ToastUtil.showToast("录音文件已达上限");
+      if (currentRecordSize + data.length >= maxRecordSize) {
+        showRecordMaxDialog("录音文件大小已达上限", tag: "recordMaxDialog");
         stopRecord();
         return;
       }
 
       targetFile.writeAsBytesSync(data, mode: FileMode.append);
       currentRecordSize += data.length;
-      currentDuration.value = currentDuration.value +
-          _getPcmDuration(data.length, recordConfig.sampleRate, 16,
-              recordConfig.numChannels);
+      currentDuration.value = currentDuration.value + nowTime;
       debugPrint(
-          "currentDuration: ${formatDuration(currentDuration.value)} , currentSize: ${currentRecordSize.toReadableSize()}");
+          "currentDuration: ${currentDuration.value} , currentSize: ${currentRecordSize.toReadableSize()}");
     }, onDone: () {
       _changeRecordStatus(RecordStatus.paused);
     }, onError: (error) {
@@ -312,13 +312,6 @@ class RecordHandler {
     }
   }
 
-  String formatDuration(double value) {
-    int hour = (value / 3600).floor();
-    int minute = ((value - hour * 3600) / 60).floor();
-    int second = (value - hour * 3600 - minute * 60).floor();
-    return '${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}:${second.toString().padLeft(2, '0')}';
-  }
-
   Future<void> _requestForegroundTaskPermission() async {
     final NotificationPermission notificationPermission =
         await FlutterForegroundTask.checkNotificationPermission();