Browse Source

fix application disposed bug

melon.yin 2 years ago
parent
commit
7e060baffa

+ 3 - 0
lib/interfaces/process/player/play_controller.dart

@@ -11,6 +11,9 @@ abstract class IPlayerController {
   /// 当前帧的信息
   VidUsImage? get currentFrame;
 
+  /// 是否已释放
+  bool get disposed;
+
   Future<void> load();
 
   /// 播放

+ 2 - 1
lib/process/workspace/measure_controller.dart

@@ -110,7 +110,7 @@ class MeasureController implements IMeasureController {
     _playerController?.dispose();
     _vidDataHost?.frameLoaded.dispose();
     Get.delete<IPlayerController>();
-    Get.delete<IApplication>();
+    // Get.delete<IApplication>();
 
     _vidDataHost = VidDataHost(url);
     _playerController =
@@ -148,6 +148,7 @@ class MeasureController implements IMeasureController {
     } else {
       app = Application(dataHost.probe);
     }
+    Get.delete<IApplication>();
     _application = Get.put<IApplication>(app);
     print("Add New" + _application.hashCode.toString());
   }

+ 11 - 0
lib/view/player/controller.dart

@@ -44,12 +44,16 @@ class VidPlayerController extends ChangeNotifier implements IPlayerController {
   VidPlayStatus _status = VidPlayStatus.init;
   int _frameIndex = -1;
   VidUsImage? _frame;
+  bool _disposed = false;
 
   ///该图像是否需要获取测量项和注释项
   bool ifNeedInit = true;
 
   final Map<Type, VidFrameProcessor> _processors = {};
 
+  @override
+  bool get disposed => _disposed;
+
   /// Current play speed
   double get currentSpeed => _speed;
 
@@ -248,10 +252,16 @@ class VidPlayerController extends ChangeNotifier implements IPlayerController {
   }
 
   Future<void> _handleUpdateFrame() async {
+    if (_disposed) return;
+
     _frame = await _dataHost.getFrame(
       currentFrameIndex,
       processors: _processors.values.toList(),
     );
+    emitFrameUpdate();
+  }
+
+  void emitFrameUpdate() {
     if (ifNeedInit) {
       currentFrameHandler.emit(this, _frame!);
       ifNeedInit = false;
@@ -286,6 +296,7 @@ class VidPlayerController extends ChangeNotifier implements IPlayerController {
 
   @override
   void dispose() {
+    _disposed = true;
     _stop(needNotify: false);
     eventHandler.dispose();
     super.dispose();

+ 10 - 4
lib/view/player/player.dart

@@ -53,9 +53,11 @@ class _VidPlayerState extends State<VidPlayer> {
   }
 
   void onControllerEvent(Object sender, VidPlayerEvent e) {
+    if (!mounted) return;
+
     if (e is VidPlayerStatusChangeEvent) {
       if (!widget.controller.hasView) {
-        setState(() {});
+        updateFrame();
       }
     }
     if (e is VidPlayerFrameIndexChangeEvent) {
@@ -82,13 +84,17 @@ class _VidPlayerState extends State<VidPlayer> {
     final newImg = await _decodeImg(e.bytes);
     if (newImg != null) {
       image = newImg;
-      oldImage?.dispose();
+      try {
+        oldImage?.dispose();
+      } catch (e) {}
     }
-    setState(() {});
+    updateFrame();
   }
 
   void updateFrame() {
-    setState(() {});
+    if (mounted) {
+      setState(() {});
+    }
   }
 
   Future<Image?> _decodeImg(Uint8List bytes) async {