浏览代码

修复打开图像可能会闪一下灰屏

loki.wu 1 年之前
父节点
当前提交
cc84f70c78

+ 1 - 1
lib/process/workspace/application.dart

@@ -109,7 +109,7 @@ class Application implements IApplication {
   VidUsImage? get frameData => _frame;
 
   @override
-  List<IVisual> get visuals => _visuals!;
+  List<IVisual> get visuals => _visuals ?? [];
 
   @override
   List<IMeasureItem> get measureItems => _measureItems;

+ 16 - 2
lib/view/paint/parts/ai_resul_info.dart

@@ -30,7 +30,7 @@ class _ResultInfoState extends State<ResultInfo> {
   IStandardLineCalibrationController? standardLineCalibrationController;
 
   late AIDetectedObject aiDetectedObjectItem;
-  late double _unitsPhysicalPixels;
+  double _unitsPhysicalPixels = 0;
   late final application = Get.find<IApplication>();
   // 图像的物理单位
   String _xUnit = '';
@@ -52,10 +52,15 @@ class _ResultInfoState extends State<ResultInfo> {
     } catch (e) {
       logger.e('standardLineCalibrationController cannot find ', e);
     }
-
     super.initState();
   }
 
+  @override
+  void didUpdateWidget(ResultInfo oldWidget) {
+    _updateImagePhysicalSize();
+    super.didUpdateWidget(oldWidget);
+  }
+
   @override
   void dispose() {
     if (standardLineCalibrationController != null) {
@@ -71,6 +76,9 @@ class _ResultInfoState extends State<ResultInfo> {
 
   @override
   Widget build(BuildContext context) {
+    if (_unitsPhysicalPixels <= 0) {
+      _updateImagePhysicalSize();
+    }
     final description = widget
         .aiDetectedObject?[aiPatintController.state.aiResultIndex].descriptions;
     var lesionSizeDescription = description?.firstWhereOrNull(
@@ -241,6 +249,12 @@ class _ResultInfoState extends State<ResultInfo> {
 
   /// 更新图像物理尺度信息
   void _updateImagePhysicalSize() {
+    if (application.visuals.isEmpty) {
+      return;
+    }
+    if (application.visuals[0].visualAreas.isEmpty) {
+      return;
+    }
     _unitsPhysicalPixels =
         (application.visuals[0].visualAreas[0].viewport?.region.width)! /
             (application.frameData!.width).toDouble();

+ 48 - 12
lib/view/paint/parts/feature_analysis.dart

@@ -10,17 +10,40 @@ import 'package:get/get.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 /// 特征分析
-class FeatureAnalysis extends StatelessWidget {
-  FeatureAnalysis(this.descriptions, {Key? key}) : super(key: key);
+class FeatureAnalysis extends StatefulWidget {
+  const FeatureAnalysis(this.descriptions, {Key? key}) : super(key: key);
 
   final List<AIDiagnosisDescription>? descriptions;
+
+  @override
+  State<StatefulWidget> createState() {
+    return FeatureAnalysisState();
+  }
+}
+
+class FeatureAnalysisState extends State<FeatureAnalysis> {
   late final aiPatintController = Get.find<AiPatintController>();
+  double _unitsPhysicalPixels = 0;
   final application = Get.find<IApplication>();
   final ScrollController scrollController = ScrollController();
+  String _xUnit = '';
+  @override
+  void initState() {
+    _updateImagePhysicalSize();
+    super.initState();
+  }
+
+  @override
+  void didUpdateWidget(FeatureAnalysis oldWidget) {
+    _updateImagePhysicalSize();
+
+    super.didUpdateWidget(oldWidget);
+  }
+
   @override
   Widget build(BuildContext context) {
     List<AIDiagnosisDescription> newDescriptions = [];
-    for (var m in descriptions!) {
+    for (var m in widget.descriptions!) {
       if (m.type != DiagnosisDescriptionEnum.CarotidIntimaMediaThickness &&
           m.type != DiagnosisDescriptionEnum.LesionSize) {
         newDescriptions.add(m);
@@ -159,18 +182,34 @@ class FeatureAnalysis extends StatelessWidget {
     }
   }
 
+  void _updateImagePhysicalSize() {
+    if (application.visuals.isEmpty) {
+      return;
+    }
+    if (application.visuals[0].visualAreas.isEmpty) {
+      return;
+    }
+    VidUsUnit targetUnit =
+        application.visuals[0].visualAreas[0].viewport?.xUnit ?? VidUsUnit.cm;
+    var unitsPhysicalPixels =
+        (application.visuals[0].visualAreas[0].viewport?.region.width)! /
+            (application.frameData!.width).toDouble();
+    setState(() {
+      _xUnit = UnitDescriptionMap.getDesc(targetUnit);
+      _unitsPhysicalPixels = unitsPhysicalPixels;
+    });
+  }
+
   String _buildDescriptionValue(
       String diagnosisDescriptionValue, DiagnosisDescriptionEnum type) {
     double? doubleValue = double.tryParse(diagnosisDescriptionValue);
-    VidUsUnit targetUnit =
-        application.visuals[0].visualAreas[0].viewport?.xUnit ?? VidUsUnit.cm;
-    var xUnit = UnitDescriptionMap.getDesc(targetUnit);
+
     if (doubleValue != null) {
       var value = doubleValue.toStringAsFixed(2);
       if (type == DiagnosisDescriptionEnum.CarotidRateOfStenosis) {
         return value;
       }
-      return '$value $xUnit';
+      return '$value $_xUnit';
     }
     if (diagnosisDescriptionValue.length > 50) {
       final diagnosisDescription = jsonDecode(diagnosisDescriptionValue);
@@ -184,16 +223,13 @@ class FeatureAnalysis extends StatelessWidget {
         double measuringLineLengthInPixel =
             diagnosisDescription['MeasuringLineLengthInPixel'] ?? 0;
 
-        var unitsPhysicalPixels =
-            (application.visuals[0].visualAreas[0].viewport?.region.width)! /
-                (application.frameData!.width).toDouble();
         if (measuringLineLengthInPixel <= 0) {
           return '< 1';
         }
-        var result = (measuringLineLengthInPixel * unitsPhysicalPixels)
+        var result = (measuringLineLengthInPixel * _unitsPhysicalPixels)
             .toStringAsFixed(2)
             .toString();
-        return '$result $xUnit';
+        return '$result $_xUnit';
       }
       return horizontalAndVertical ? '> 1' : '< 1';
     } else {