Browse Source

摄像头前后切换加入防抖

gavin.chen 1 year ago
parent
commit
3d213ac55d

+ 34 - 0
lib/architecture/utils/advance_debounce.dart

@@ -0,0 +1,34 @@
+// 防抖函数上次触发的时间
+Map<String, DateTime> _funcDebounceLastCall = {};
+
+/// 函数防抖 (可自定义标识)
+/// 用于搜索框之类的频繁触发的方法,防止频繁触发,连续触发部分可能被忽略
+/// [func]: 要执行的方法
+/// [funcTag]: 方法标识符
+/// [milliseconds]: 要迟延的毫秒时间
+Function advanceDebounce(Function func, String funcTag,
+    [int milliseconds = 2000]) {
+  target() {
+    String key = funcTag.toString();
+    // 判断是否是第一次调用
+    if (_funcDebounceLastCall[key] == null) {
+      func.call();
+      _funcDebounceLastCall[key] = DateTime.now();
+    } else {
+      // 判断是否超过了延迟时间
+      if (DateTime.now()
+              .difference(_funcDebounceLastCall[key]!)
+              .inMilliseconds >
+          milliseconds) {
+        _funcDebounceLastCall[key] = DateTime.now();
+        func.call();
+      } else {
+        print("[debounce] $funcTag skip");
+      }
+    }
+  }
+
+  target();
+
+  return target;
+}

+ 10 - 0
lib/pages/facial_recognition/controller.dart

@@ -221,6 +221,16 @@ class FacialRecognitionController extends GetxController
     }
   }
 
+  /// 前后置摄像头切换
+
+  void switchCameraLens() async {
+    if (state.isUsingFrontCamera) {
+      openBackCamera();
+    } else {
+      openFrontCamera();
+    }
+  }
+
   /// 相机锁定旋转
   Future<void> lockCaptureOrientation() async {
     final CameraController? cameraController = kCameraController;

+ 2 - 5
lib/pages/facial_recognition/view.dart

@@ -2,6 +2,7 @@ import 'package:camera/camera.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:vitalapp/architecture/utils/advance_debounce.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'index.dart';
 import 'widgets/widgets.dart';
@@ -115,11 +116,7 @@ class FacialRecognitionPage extends GetView<FacialRecognitionController> {
       }
       return GestureDetector(
         onTap: () {
-          if (controller.state.isUsingFrontCamera) {
-            controller.openBackCamera();
-          } else {
-            controller.openFrontCamera();
-          }
+          advanceDebounce(controller.switchCameraLens, "capture", 1500);
         },
         child: Container(
           padding: const EdgeInsets.all(10.0),