瀏覽代碼

update(measure): 优化函数名、优化代码结构 Review by baka

gavin.chen 2 年之前
父節點
當前提交
81e758503c

+ 14 - 12
lib/process/workspace/measure_handler.dart

@@ -3,6 +3,8 @@ import 'dart:core';
 import 'package:fis_common/event/event_type.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
+import 'package:fis_measure/interfaces/enums/operate.dart';
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_measure/view/measure/tool_chest_title.dart';
 
 class ChangeImageInfo {
@@ -64,7 +66,7 @@ abstract class IMeasureHandler {
   late FEventHandler<MeasureModeSubmit> onMeasureModeSubmitChanged;
 
   /// 测量还是注释tab
-  late FEventHandler<TabEnum> onChangedTab;
+  late FEventHandler<MeasureOperateType> onOperateTypeChanged;
 
   /// 注释箭头还是标签
   late FEventHandler<AnnotationType> onChangedAnnotationType;
@@ -103,8 +105,8 @@ abstract class IMeasureHandler {
   set measureModeSubmitChanged(MeasureModeSubmit value);
 
   /// 切换Tab
-  TabEnum get changedTab;
-  set changedTab(TabEnum value);
+  MeasureOperateType get currOperateType;
+  set currOperateType(MeasureOperateType value);
 
   /// 切换注释
   AnnotationType get changedAnnotationType;
@@ -131,7 +133,7 @@ class MeasureHandler implements IMeasureHandler {
   MeasureModeSubmit _measureModeSubmitChanged =
       MeasureModeSubmit(null, null, null, null);
 
-  TabEnum _changedTab = TabEnum.tabMeasureTool;
+  MeasureOperateType _currOperateType = MeasureOperateType.measure;
 
   bool _changeImageLoaded = true;
 
@@ -149,7 +151,7 @@ class MeasureHandler implements IMeasureHandler {
   @override
   var onMeasureModeSubmitChanged = FEventHandler<MeasureModeSubmit>();
   @override
-  var onChangedTab = FEventHandler<TabEnum>();
+  var onOperateTypeChanged = FEventHandler<MeasureOperateType>();
 
   @override
   var onChangedAnnotationType = FEventHandler<AnnotationType>();
@@ -186,7 +188,7 @@ class MeasureHandler implements IMeasureHandler {
   MeasureModeSubmit get measureModeSubmitChanged => _measureModeSubmitChanged;
 
   @override
-  TabEnum get changedTab => _changedTab;
+  MeasureOperateType get currOperateType => _currOperateType;
 
   @override
   AnnotationType get changedAnnotationType => _changedAnnotationType;
@@ -223,10 +225,10 @@ class MeasureHandler implements IMeasureHandler {
   }
 
   @override
-  set changedTab(TabEnum value) {
-    if (value != _changedTab) {
-      _changedTab = value;
-      _onChangedTab();
+  set currOperateType(MeasureOperateType value) {
+    if (value != _currOperateType) {
+      _currOperateType = value;
+      _onOperateTypeChanged();
     }
   }
 
@@ -274,8 +276,8 @@ class MeasureHandler implements IMeasureHandler {
     onMeasureModeSubmitChanged.emit(this, measureModeSubmitChanged);
   }
 
-  void _onChangedTab() {
-    onChangedTab.emit(this, changedTab);
+  void _onOperateTypeChanged() {
+    onOperateTypeChanged.emit(this, currOperateType);
   }
 
   void _onChangeImageLoaded() {

+ 5 - 4
lib/view/measure/arrow_annotation_button.dart

@@ -3,6 +3,7 @@ import 'package:fis_measure/interfaces/enums/annotation.dart';
 import 'package:fis_measure/interfaces/enums/operate.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/process/workspace/measure_handler.dart';
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_measure/view/measure/tool_chest_title.dart';
 import 'package:fis_ui/index.dart';
 import 'package:flutter/material.dart';
@@ -34,9 +35,9 @@ class ArrowAnnotationButtonState extends FState<ArrowAnnotationButton> {
     setState(() {});
   }
 
-  void _onChangedTab(
+  void _onOperateTypeChanged(
     Object sender,
-    TabEnum? e,
+    MeasureOperateType? e,
   ) {
     setState(() {});
   }
@@ -45,7 +46,7 @@ class ArrowAnnotationButtonState extends FState<ArrowAnnotationButton> {
   void initState() {
     measureHandler.onChangedAnnotationType
         .addListener(_onChangedAnnotationType);
-    measureHandler.onChangedTab.addListener(_onChangedTab);
+    measureHandler.onOperateTypeChanged.addListener(_onOperateTypeChanged);
     super.initState();
   }
 
@@ -53,7 +54,7 @@ class ArrowAnnotationButtonState extends FState<ArrowAnnotationButton> {
   void dispose() {
     measureHandler.onChangedAnnotationType
         .removeListener(_onChangedAnnotationType);
-    measureHandler.onChangedTab.removeListener(_onChangedTab);
+    measureHandler.onOperateTypeChanged.removeListener(_onOperateTypeChanged);
     super.dispose();
   }
 

+ 6 - 4
lib/view/measure/measure_main_view.dart

@@ -518,7 +518,9 @@ class _MeasureMainViewState extends State<MeasureMainView> {
                   ),
                   const FSizedBox(height: 20),
                   FText(
-                    loadingText!.isNotEmpty ? loadingText : '加载中',
+                    loadingText!.isNotEmpty
+                        ? loadingText
+                        : i18nBook.common.loading.t,
                     style: const TextStyle(
                       color: Colors.white,
                     ),
@@ -547,9 +549,9 @@ class _MeasureMainViewState extends State<MeasureMainView> {
   Widget _buildAiTips() {
     return Transform(
       transform: Matrix4.translationValues(0, -18, 0),
-      child: const Text(
-        '提醒:自动测量可能存在误差,仅供参考',
-        style: TextStyle(color: Colors.grey, fontSize: 18, height: 1),
+      child: Text(
+        i18nBook.measure.carotidAiTips.t,
+        style: const TextStyle(color: Colors.grey, fontSize: 18, height: 1),
       ),
     );
   }

+ 6 - 2
lib/view/measure/measure_search_input.dart

@@ -1,9 +1,11 @@
 import 'package:fis_i18n/i18n.dart';
 import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/enums/operate.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/process/workspace/measure_data_controller.dart';
 import 'package:fis_measure/process/workspace/measure_handler.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_measure/view/measure/tool_chest_title.dart';
 import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
@@ -78,8 +80,10 @@ class _LeftSelectInputState extends FState<LeftSelectInput> {
                       annotationItem,
                     );
                     if (result ?? false) {
-                      measureHandler.changedTab = TabEnum.tabMeasureTool;
-                      measureHandler.changedTab = TabEnum.tabNodesTool;
+                      measureHandler.currOperateType =
+                          MeasureOperateType.measure;
+                      measureHandler.currOperateType =
+                          MeasureOperateType.annotation;
                       getAnnotationList();
                     }
                   }

+ 9 - 7
lib/view/measure/measure_tool_panel.dart

@@ -1,5 +1,6 @@
 import 'package:fis_i18n/i18n.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
+import 'package:fis_measure/interfaces/enums/operate.dart';
 import 'package:fis_measure/interfaces/process/player/play_controller.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/workspace/measure_3d_view_controller.dart';
@@ -14,6 +15,7 @@ import 'package:fis_measure/view/measure/measure_tool.dart';
 import 'package:fis_measure/view/measure/carotid_measure_tool.dart';
 import 'package:fis_measure/view/measure/measure_tools_title.dart';
 import 'package:fis_measure/view/measure/measure_view_controller.dart';
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_measure/view/measure/tool_chest_title.dart';
 import 'package:fis_ui/index.dart';
 import 'package:fis_ui/interface/interactive_container.dart';
@@ -57,13 +59,13 @@ class MeasureToolPanelState extends State<MeasureToolPanel> {
   bool isMeasureTool = true;
   bool get isArrowMeasureAnnotationType =>
       measureHandler.changedAnnotationType == AnnotationType.arrow;
-  TabEnum curSelectedTab = TabEnum.tabMeasureTool;
-  void _onChangedTab(
+  MeasureOperateType currOperateType = MeasureOperateType.measure;
+  void _onOperateTypeChanged(
     Object sender,
-    TabEnum e,
+    MeasureOperateType e,
   ) {
     setState(() {
-      curSelectedTab = e;
+      currOperateType = e;
     });
   }
 
@@ -90,7 +92,7 @@ class MeasureToolPanelState extends State<MeasureToolPanel> {
 
   @override
   void initState() {
-    measureHandler.onChangedTab.addListener(_onChangedTab);
+    measureHandler.onOperateTypeChanged.addListener(_onOperateTypeChanged);
     measure3DViewController.updatePlayerMode.addListener(_onModeChanged);
     measureData.curItemMetaListChanged.addListener(_onCurItemMetaListChanged);
     measureHandler.onChangeImageLoaded.addListener(_onChangeImage);
@@ -100,7 +102,7 @@ class MeasureToolPanelState extends State<MeasureToolPanel> {
 
   @override
   void dispose() {
-    measureHandler.onChangedTab.removeListener(_onChangedTab);
+    measureHandler.onOperateTypeChanged.removeListener(_onOperateTypeChanged);
     measure3DViewController.updatePlayerMode.removeListener(_onModeChanged);
     measureData.curItemMetaListChanged
         .removeListener(_onCurItemMetaListChanged);
@@ -139,7 +141,7 @@ class MeasureToolPanelState extends State<MeasureToolPanel> {
     }
   }
 
-  bool get hideMeasureTab => (curSelectedTab == TabEnum.tabNodesTool);
+  bool get hideMeasureTab => (currOperateType == MeasureOperateType.annotation);
   bool get hideCommentTab => !hideMeasureTab;
   @override
   FWidget build(BuildContext context) {

+ 151 - 0
lib/view/measure/operate_type_change_button.dart

@@ -0,0 +1,151 @@
+import 'package:fis_i18n/i18n.dart';
+import 'package:fis_measure/interfaces/enums/annotation.dart';
+import 'package:fis_measure/interfaces/enums/operate.dart';
+import 'package:fis_measure/interfaces/process/player/play_controller.dart';
+import 'package:fis_measure/interfaces/process/workspace/application.dart';
+import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
+import 'package:fis_measure/process/workspace/measure_controller.dart';
+import 'package:fis_measure/process/workspace/measure_data_controller.dart';
+import 'package:fis_measure/process/workspace/measure_handler.dart';
+import 'package:fis_measure/view/measure/measure_view_controller.dart';
+import 'package:fis_measure/view/player/controller.dart';
+import 'package:fis_theme/theme.dart';
+import 'package:fis_ui/index.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:vid/us/vid_us_image.dart';
+
+/// 测量工具 注释工具Tab
+class OperateTypeChangeButton extends StatefulWidget implements FWidget {
+  const OperateTypeChangeButton({super.key});
+
+  @override
+  State<OperateTypeChangeButton> createState() =>
+      OperateTypeChangeButtonState();
+}
+
+class OperateTypeChangeButtonState extends State<OperateTypeChangeButton>
+    with TickerProviderStateMixin {
+  late final measureHandler = Get.find<MeasureHandler>();
+  late TabController tabController;
+  late final measureData = Get.find<MeasureDataController>();
+  // List<Center> tabs = [];
+  bool isShowMeasureButton = true;
+
+  /// 全部图片list
+  final measureController = Get.find<MeasureController>();
+  VidPlayerController playerController =
+      Get.find<IPlayerController>() as VidPlayerController;
+
+  @override
+  void initState() {
+    super.initState();
+    measureHandler.annotationsLoaded.addListener(onAnnotationsLoaded);
+    measureController.imageLoaded.addListener(_onImageLoaded);
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    measureHandler.annotationsLoaded.removeListener(onAnnotationsLoaded);
+    measureController.imageLoaded.removeListener(_onImageLoaded);
+    tabController.dispose();
+  }
+
+  void initTab() {
+    final application = Get.find<IApplication>();
+
+    ///TODO:[Gavin] 虽然屏蔽了多幅,但是切换至多幅时候仍会存在问题【虽然只显示注释,但是默认会被切换至第一个测量项】
+    ///原因是Tab页切换优化为了FOffstage的方式,Measure Tab 实际没有被 dispose
+    ///比较妥协的临时解决方案是,触发切换注释时加上 500ms 延时【line 178:180】
+    if (application.isSingleFrame && application.visuals.length > 1) {
+      //多幅vid
+      // tabs = [i18nBook.measure.annotationTool.t]
+      //     .map((e) => Center(child: Tab(text: e)))
+      //     .toList();
+      setState(() {
+        isShowMeasureButton = false;
+      });
+      changeTypeTo(MeasureOperateType.annotation);
+    } else {
+      // tabs = [i18nBook.measure.measureTool.t, i18nBook.measure.annotationTool.t]
+      //     .map((e) => Center(child: Tab(text: e)))
+      //     .toList();
+      setState(() {
+        isShowMeasureButton = true;
+      });
+      changeTypeTo(MeasureOperateType.measure);
+    }
+    // setState(() {});
+  }
+
+  void changeTypeTo(e) {
+    measureHandler.currOperateType = e;
+    if (e == MeasureOperateType.measure) {
+      final measureMetaController = Get.find<MeasureMetaController>();
+      measureMetaController.setAvailableModes(measureData.currentMode);
+
+      /// 用于切换到第一个测量项
+      measureMetaController.updateItemList();
+    } else {
+      final application = Get.find<IApplication>();
+      Future.delayed(const Duration(milliseconds: 500), () {
+        application.switchAnnotation(AnnotationType.label, "test");
+      });
+    }
+  }
+
+  // 应该在图像注释获取完成后再触发initTab
+  void onAnnotationsLoaded(Object sender, _) {
+    if (!mounted) return;
+    initTab();
+  }
+
+  void _onFrameLoadedAfterFirst(Object sender, VidUsImage? e) {
+    if (!mounted) return;
+    initTab();
+    playerController.firstFrameLoaded.removeListener(_onFrameLoadedAfterFirst);
+  }
+
+  void _onImageLoaded(Object sender, ExamImageInfo? e) {
+    playerController = Get.find<IPlayerController>() as VidPlayerController;
+    playerController.firstFrameLoaded.addListener(_onFrameLoadedAfterFirst);
+  }
+
+  @override
+  void didUpdateWidget(covariant OperateTypeChangeButton oldWidget) {
+    super.didUpdateWidget(oldWidget);
+  }
+
+  @override
+  FWidget build(BuildContext context) {
+    tabController = TabController(
+      vsync: this,
+      length: isShowMeasureButton ? 2 : 1,
+      initialIndex: 0,
+    );
+    final _colorScheme = FTheme.ins.colorScheme;
+
+    return FTabBar(
+      indicatorWeight: 2,
+      indicatorColor: _colorScheme.primary,
+      labelColor: _colorScheme.primary,
+      indicatorSize: TabBarIndicatorSize.label,
+      unselectedLabelColor: Colors.white,
+      onTap: (int index) {
+        try {
+          changeTypeTo(MeasureOperateType.values[index]);
+        } catch (e) {
+          debugPrint(e.toString());
+        }
+      },
+      tabs: isShowMeasureButton
+          ? [
+              Center(child: Tab(text: i18nBook.measure.measureTool.t)),
+              Center(child: Tab(text: i18nBook.measure.annotationTool.t))
+            ]
+          : [Center(child: Tab(text: i18nBook.measure.annotationTool.t))],
+      controller: tabController,
+    );
+  }
+}

+ 117 - 125
lib/view/measure/tool_chest_title.dart

@@ -1,33 +1,24 @@
 import 'package:fis_i18n/i18n.dart';
-import 'package:fis_measure/interfaces/enums/annotation.dart';
-import 'package:fis_measure/interfaces/process/player/play_controller.dart';
-import 'package:fis_measure/interfaces/process/workspace/application.dart';
-import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
-import 'package:fis_measure/process/workspace/measure_controller.dart';
-import 'package:fis_measure/process/workspace/measure_data_controller.dart';
-import 'package:fis_measure/process/workspace/measure_handler.dart';
 import 'package:fis_measure/view/measure/measure_config/measure_configuation_page.dart';
 import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart';
-import 'package:fis_measure/view/measure/measure_view_controller.dart';
-import 'package:fis_measure/view/player/controller.dart';
+import 'package:fis_measure/view/measure/operate_type_change_button.dart';
 import 'package:fis_theme/theme.dart';
 import 'package:fis_ui/index.dart';
 import 'package:fis_ui/interface/interactive_container.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
-import 'package:vid/us/vid_us_image.dart';
 
 /// 下拉选择的类
-class MeasureSelectModel {
-  MeasureSelectModel({required this.name, required this.code});
-  final String name;
-  final String code;
-}
+// class MeasureSelectModel {
+//   MeasureSelectModel({required this.name, required this.code});
+//   final String name;
+//   final String code;
+// }
 
-enum TabEnum {
-  tabMeasureTool,
-  tabNodesTool,
-}
+// enum MeasureOperateType {
+//   tabMeasureTool,
+//   tabNodesTool,
+// }
 
 /// 工具箱 样式配置之类
 class LeftSiderHold extends StatelessWidget implements FWidget {
@@ -60,7 +51,8 @@ class LeftSiderHold extends StatelessWidget implements FWidget {
               LeftSiderHoldAllStyleConfig(ifHideConfig: ifHideConfig),
             ],
           ),
-          const _LeftSiderTabBar(),
+          const OperateTypeChangeButton(),
+          // const _LeftSiderTabBar(),
           // _LeftSelectInput(),
           // _LeftPulldown(),
         ],
@@ -120,125 +112,125 @@ class LeftSiderHoldAllStyleConfig extends StatelessWidget
   }
 }
 
-/// 测量工具 注释工具Tab
-class _LeftSiderTabBar extends StatefulWidget implements FWidget {
-  const _LeftSiderTabBar();
+/// 测量工具 注释工具Tab [已废弃:重构为]
+// class _LeftSiderTabBar extends StatefulWidget implements FWidget {
+//   const _LeftSiderTabBar();
 
-  @override
-  State<_LeftSiderTabBar> createState() => _LeftSiderTabBarState();
-}
+//   @override
+//   State<_LeftSiderTabBar> createState() => _LeftSiderTabBarState();
+// }
 
-class _LeftSiderTabBarState extends State<_LeftSiderTabBar>
-    with TickerProviderStateMixin {
-  late final measureHandler = Get.find<MeasureHandler>();
-  late TabController tabController;
-  List<Center> tabs = [];
-  late final measureData = Get.find<MeasureDataController>();
+// class _LeftSiderTabBarState extends State<_LeftSiderTabBar>
+//     with TickerProviderStateMixin {
+//   late final measureHandler = Get.find<MeasureHandler>();
+//   late TabController tabController;
+//   List<Center> tabs = [];
+//   late final measureData = Get.find<MeasureDataController>();
 
-  /// 全部图片list
-  final measureController = Get.find<MeasureController>();
-  VidPlayerController playerController =
-      Get.find<IPlayerController>() as VidPlayerController;
+//   /// 全部图片list
+//   final measureController = Get.find<MeasureController>();
+//   VidPlayerController playerController =
+//       Get.find<IPlayerController>() as VidPlayerController;
 
-  @override
-  void initState() {
-    super.initState();
-    measureHandler.annotationsLoaded.addListener(onAnnotationsLoaded);
-    measureController.imageLoaded.addListener(_onImageLoaded);
-  }
+//   @override
+//   void initState() {
+//     super.initState();
+//     measureHandler.annotationsLoaded.addListener(onAnnotationsLoaded);
+//     measureController.imageLoaded.addListener(_onImageLoaded);
+//   }
 
-  @override
-  void dispose() {
-    super.dispose();
-    measureHandler.annotationsLoaded.removeListener(onAnnotationsLoaded);
-    measureController.imageLoaded.removeListener(_onImageLoaded);
-    tabController.dispose();
-  }
+//   @override
+//   void dispose() {
+//     super.dispose();
+//     measureHandler.annotationsLoaded.removeListener(onAnnotationsLoaded);
+//     measureController.imageLoaded.removeListener(_onImageLoaded);
+//     tabController.dispose();
+//   }
 
-  void initTab() {
-    final application = Get.find<IApplication>();
+//   void initTab() {
+//     final application = Get.find<IApplication>();
 
-    ///TODO:[Gavin] 虽然屏蔽了多幅,但是切换至多幅时候仍会存在问题【虽然只显示注释,但是默认会被切换至第一个测量项】
-    ///原因是Tab页切换优化为了FOffstage的方式,Measure Tab 实际没有被 dispose
-    ///比较妥协的临时解决方案是,触发切换注释时加上 500ms 延时【line 178:180】
-    if (application.isSingleFrame && application.visuals.length > 1) {
-      //多幅vid
-      tabs = [i18nBook.measure.annotationTool.t]
-          .map((e) => Center(child: Tab(text: e)))
-          .toList();
-      changeTabTo(TabEnum.tabNodesTool);
-    } else {
-      tabs = [i18nBook.measure.measureTool.t, i18nBook.measure.annotationTool.t]
-          .map((e) => Center(child: Tab(text: e)))
-          .toList();
-      changeTabTo(TabEnum.tabMeasureTool);
-    }
-    setState(() {});
-  }
+//     ///TODO:[Gavin] 虽然屏蔽了多幅,但是切换至多幅时候仍会存在问题【虽然只显示注释,但是默认会被切换至第一个测量项】
+//     ///原因是Tab页切换优化为了FOffstage的方式,Measure Tab 实际没有被 dispose
+//     ///比较妥协的临时解决方案是,触发切换注释时加上 500ms 延时【line 178:180】
+//     if (application.isSingleFrame && application.visuals.length > 1) {
+//       //多幅vid
+//       tabs = [i18nBook.measure.annotationTool.t]
+//           .map((e) => Center(child: Tab(text: e)))
+//           .toList();
+//       changeTabTo(MeasureOperateType.tabNodesTool);
+//     } else {
+//       tabs = [i18nBook.measure.measureTool.t, i18nBook.measure.annotationTool.t]
+//           .map((e) => Center(child: Tab(text: e)))
+//           .toList();
+//       changeTabTo(MeasureOperateType.tabMeasureTool);
+//     }
+//     setState(() {});
+//   }
 
-  void changeTabTo(e) {
-    measureHandler.changedTab = e;
-    if (e == TabEnum.tabMeasureTool) {
-      final measureMetaController = Get.find<MeasureMetaController>();
-      measureMetaController.setAvailableModes(measureData.currentMode);
-      measureMetaController.updateItemList();
-    } else {
-      final application = Get.find<IApplication>();
-      Future.delayed(const Duration(milliseconds: 500), () {
-        application.switchAnnotation(AnnotationType.label, "test");
-      });
-    }
-  }
+//   void changeTabTo(e) {
+//     measureHandler.currOperateType = e;
+//     if (e == MeasureOperateType.tabMeasureTool) {
+//       final measureMetaController = Get.find<MeasureMetaController>();
+//       measureMetaController.setAvailableModes(measureData.currentMode);
+//       measureMetaController.updateItemList();
+//     } else {
+//       final application = Get.find<IApplication>();
+//       Future.delayed(const Duration(milliseconds: 500), () {
+//         application.switchAnnotation(AnnotationType.label, "test");
+//       });
+//     }
+//   }
 
-  // 应该在图像注释获取完成后再触发initTab
-  void onAnnotationsLoaded(Object sender, _) {
-    if (!mounted) return;
-    initTab();
-  }
+//   // 应该在图像注释获取完成后再触发initTab
+//   void onAnnotationsLoaded(Object sender, _) {
+//     if (!mounted) return;
+//     initTab();
+//   }
 
-  void _onFrameLoadedAfterFirst(Object sender, VidUsImage? e) {
-    if (!mounted) return;
-    initTab();
-    playerController.firstFrameLoaded.removeListener(_onFrameLoadedAfterFirst);
-  }
+//   void _onFrameLoadedAfterFirst(Object sender, VidUsImage? e) {
+//     if (!mounted) return;
+//     initTab();
+//     playerController.firstFrameLoaded.removeListener(_onFrameLoadedAfterFirst);
+//   }
 
-  void _onImageLoaded(Object sender, ExamImageInfo? e) {
-    playerController = Get.find<IPlayerController>() as VidPlayerController;
-    playerController.firstFrameLoaded.addListener(_onFrameLoadedAfterFirst);
-  }
+//   void _onImageLoaded(Object sender, ExamImageInfo? e) {
+//     playerController = Get.find<IPlayerController>() as VidPlayerController;
+//     playerController.firstFrameLoaded.addListener(_onFrameLoadedAfterFirst);
+//   }
 
-  @override
-  void didUpdateWidget(covariant _LeftSiderTabBar oldWidget) {
-    super.didUpdateWidget(oldWidget);
-  }
+//   @override
+//   void didUpdateWidget(covariant _LeftSiderTabBar oldWidget) {
+//     super.didUpdateWidget(oldWidget);
+//   }
 
-  @override
-  FWidget build(BuildContext context) {
-    tabController = TabController(
-      vsync: this,
-      length: tabs.length,
-      initialIndex: 0,
-    );
-    final _colorScheme = FTheme.ins.colorScheme;
+//   @override
+//   FWidget build(BuildContext context) {
+//     tabController = TabController(
+//       vsync: this,
+//       length: tabs.length,
+//       initialIndex: 0,
+//     );
+//     final _colorScheme = FTheme.ins.colorScheme;
 
-    return FTabBar(
-      indicatorWeight: 2,
-      indicatorColor: _colorScheme.primary,
-      labelColor: _colorScheme.primary,
-      indicatorSize: TabBarIndicatorSize.label,
-      unselectedLabelColor: Colors.white,
-      onTap: (int index) {
-        try {
-          changeTabTo(TabEnum.values[index]);
-        } catch (e) {
-          debugPrint(e.toString());
-        }
-      },
-      tabs: tabs,
-      controller: tabController,
-    );
-  }
-}
+//     return FTabBar(
+//       indicatorWeight: 2,
+//       indicatorColor: _colorScheme.primary,
+//       labelColor: _colorScheme.primary,
+//       indicatorSize: TabBarIndicatorSize.label,
+//       unselectedLabelColor: Colors.white,
+//       onTap: (int index) {
+//         try {
+//           changeTabTo(MeasureOperateType.values[index]);
+//         } catch (e) {
+//           debugPrint(e.toString());
+//         }
+//       },
+//       tabs: tabs,
+//       controller: tabController,
+//     );
+//   }
+// }
 
 // class _LeftPulldown extends StatelessWidget implements FWidget {
 //   @override