diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 2721dfb0b..5311ed23e 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -358,14 +358,14 @@ class _VideoDetailPageVState extends State AutoOrientation.portraitUpMode(); } shutdownTimerService.handleWaitingFinished(); - if (videoDetailController.plPlayerController.backToHome != true) { + if (!videoDetailController.plPlayerController.isCloseAll) { videoPlayerServiceHandler?.onVideoDetailDispose(heroTag); - } - if (plPlayerController != null) { - videoDetailController.makeHeartBeat(); - plPlayerController!.dispose(); - } else { - PlPlayerController.updatePlayCount(); + if (plPlayerController != null) { + videoDetailController.makeHeartBeat(); + plPlayerController!.dispose(); + } else { + PlPlayerController.updatePlayCount(); + } } PageUtils.routeObserver.unsubscribe(this); WidgetsBinding.instance.removeObserver(this); @@ -716,9 +716,9 @@ class _VideoDetailPageVState extends State ), onPressed: () { videoDetailController - .plPlayerController - .backToHome = - true; + .plPlayerController + ..isCloseAll = true + ..dispose(); Get.until( (route) => route.isFirst, ); @@ -1328,8 +1328,9 @@ class _VideoDetailPageVState extends State ], ), onPressed: () { - videoDetailController.plPlayerController.backToHome = - true; + videoDetailController.plPlayerController + ..isCloseAll = true + ..dispose(); Get.until((route) => route.isFirst); }, ), diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 5152aeaf3..7285aed0a 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -1966,7 +1966,9 @@ class HeaderControlState extends State { color: Colors.white, ), onPressed: () { - videoDetailCtr.plPlayerController.backToHome = true; + videoDetailCtr.plPlayerController + ..isCloseAll = true + ..dispose(); Get.until((route) => route.isFirst); }, ), diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index eeee8b228..22ef383e0 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -124,7 +124,6 @@ class PlPlayerController { final RxBool _isSliderMoving = false.obs; PlaylistMode _looping = PlaylistMode.none; bool _autoPlay = false; - final bool _listenersInitialized = false; // 记录历史记录 int? _aid; @@ -504,8 +503,6 @@ class PlPlayerController { _playCallBack = playCallBack; } - bool? backToHome; - static Function? _playCallBack; static void playIfExists({bool repeat = false, bool hideControls = true}) { @@ -660,9 +657,7 @@ class PlPlayerController { dataStatus.status.value = DataStatus.loaded; // listen the video player events - if (!_listenersInitialized) { - startListeners(); - } + startListeners(); await _initializePlayer(); } catch (err, stackTrace) { dataStatus.status.value = DataStatus.error; @@ -1136,10 +1131,10 @@ class PlPlayerController { } /// 移除事件监听 - void removeListeners() { - for (final s in subscriptions) { - s.cancel(); - } + Future removeListeners() async { + _statusListeners.clear(); + _positionListeners.clear(); + await Future.wait(subscriptions.map((e) => e.cancel())); } /// 跳转至指定位置 @@ -1672,10 +1667,11 @@ class PlPlayerController { }); } + bool isCloseAll = false; Future dispose() async { // 每次减1,最后销毁 cancelLongPressTimer(); - if (_playerCount > 1) { + if (!isCloseAll && _playerCount > 1) { _playerCount -= 1; _heartDuration = 0; if (!Get.previousRoute.startsWith('/video')) { @@ -1687,36 +1683,27 @@ class PlPlayerController { _playerCount = 0; _clearPreview(); Utils.channel.setMethodCallHandler(null); - pause(); - try { - _timer?.cancel(); - _timerForSeek?.cancel(); - _timerForShowingVolume?.cancel(); - // _position.close(); - _playerEventSubs?.cancel(); - // _sliderPosition.close(); - // _sliderTempPosition.close(); - // _isSliderMoving.close(); - // _duration.close(); - // _buffered.close(); - // _showControls.close(); - // _controlsLock.close(); + _timer?.cancel(); + _timerForSeek?.cancel(); + _timerForShowingVolume?.cancel(); + // _position.close(); + _playerEventSubs?.cancel(); + // _sliderPosition.close(); + // _sliderTempPosition.close(); + // _isSliderMoving.close(); + // _duration.close(); + // _buffered.close(); + // _showControls.close(); + // _controlsLock.close(); - // playerStatus.status.close(); - // dataStatus.status.close(); + // playerStatus.status.close(); + // dataStatus.status.close(); - if (_videoPlayerController != null) { - var pp = _videoPlayerController!.platform!; - await pp.setProperty('audio-files', ''); - removeListeners(); - await _videoPlayerController!.dispose(); - _videoPlayerController = null; - } - _instance = null; - videoPlayerServiceHandler?.clear(); - } catch (err) { - if (kDebugMode) debugPrint(err.toString()); - } + await removeListeners(); + _videoPlayerController?.dispose(); + _videoPlayerController = null; + _instance = null; + videoPlayerServiceHandler?.clear(); } static void updatePlayCount() {