Преглед изворни кода

Merge pull request #71 from CaiJingLong/fix-tabview-use-error

Fix error in tabview.
Caijinglong пре 6 година
родитељ
комит
ff750a9cc8
2 измењених фајлова са 25 додато и 10 уклоњено
  1. 15 5
      lib/src/controller/controller.dart
  2. 10 5
      lib/src/controller/ijkplayer_controller_mixin.dart

+ 15 - 5
lib/src/controller/controller.dart

@@ -19,6 +19,15 @@ class IjkMediaController
     index = IjkMediaPlayerManager().add(this);
   }
 
+  @override
+  set _ijkStatus(IjkStatus status) {
+    if (__ijkStatus == IjkStatus.disposed) {
+      dispose(false);
+      return;
+    }
+    super._ijkStatus = status;
+  }
+
   /// create ijk texture id from native
   Future<void> _initIjk() async {
     try {
@@ -45,22 +54,23 @@ class IjkMediaController
   }
 
   /// [reset] and close all controller
-  void dispose() async {
-    await reset();
-    await _disposeStream();
+  void dispose([changeStatus = true]) async {
+    _isDispose = true;
+    await reset(changeStatus);
+    await _disposeStream(changeStatus);
 
     IjkMediaPlayerManager().remove(this);
   }
 
   /// dispose all resource
-  Future<void> reset() async {
+  Future<void> reset([changeStatus = true]) async {
     volume = 100;
     this.textureId = null;
     _plugin?.dispose();
     _plugin = null;
     eventChannel?.dispose();
     eventChannel = null;
-    _ijkStatus = IjkStatus.noDatasource;
+    if (changeStatus) _ijkStatus = IjkStatus.noDatasource;
   }
 
   /// set net DataSource

+ 10 - 5
lib/src/controller/ijkplayer_controller_mixin.dart

@@ -4,17 +4,19 @@ mixin IjkMediaControllerMixin {
   List<GlobalKey> _keys = [];
 
   attach(GlobalKey key) {
-    print("IjkMediaControllerMixin attach $key");
+    LogUtils.info("IjkMediaControllerMixin attach $key");
     _keys.add(key);
   }
 
   detach(GlobalKey key) {
-    print("IjkMediaControllerMixin detach $key");
+    LogUtils.info("IjkMediaControllerMixin detach $key");
     _keys.remove(key);
   }
 }
 
 mixin IjkMediaControllerStreamMixin {
+  var _isDispose = false;
+
   /// texture id from native
   int _textureId;
 
@@ -23,8 +25,9 @@ mixin IjkMediaControllerStreamMixin {
 
   /// set texture id, Normally the user does not call
   set textureId(int id) {
+    if (_isDispose) return;
     _textureId = id;
-    _textureIdController.add(id);
+    _textureIdController?.add(id);
   }
 
   /// on texture id change
@@ -50,6 +53,7 @@ mixin IjkMediaControllerStreamMixin {
 
   /// playing state
   set isPlaying(bool value) {
+    if (_isDispose) return;
     this._isPlaying = value;
     _playingController?.add(value);
     if (value == true) {
@@ -86,6 +90,7 @@ mixin IjkMediaControllerStreamMixin {
 
   /// video volume, not system volume
   set volume(int value) {
+    if (_isDispose) return;
     if (value > 100) {
       value = 100;
     } else if (value < 0) {
@@ -193,8 +198,8 @@ mixin IjkMediaControllerStreamMixin {
 
   void _setVolume(int value);
 
-  Future<void> _disposeStream() async {
-    _ijkStatus = IjkStatus.disposed;
+  Future<void> _disposeStream([changeStatus = true]) async {
+    if (changeStatus) _ijkStatus = IjkStatus.disposed;
     _playingController?.close();
     _videoInfoController?.close();
     _textureIdController?.close();