fix: 3.13 生命周期监听

This commit is contained in:
guozhigq
2023-12-27 23:52:06 +08:00
parent 7feb462ea5
commit 063177a4a3

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:ui';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:floating/floating.dart'; import 'package:floating/floating.dart';
@ -34,7 +35,7 @@ class VideoDetailPage extends StatefulWidget {
} }
class _VideoDetailPageState extends State<VideoDetailPage> class _VideoDetailPageState extends State<VideoDetailPage>
with TickerProviderStateMixin, RouteAware, WidgetsBindingObserver { with TickerProviderStateMixin, RouteAware {
late VideoDetailController videoDetailController; late VideoDetailController videoDetailController;
PlPlayerController? plPlayerController; PlPlayerController? plPlayerController;
final ScrollController _extendNestCtr = ScrollController(); final ScrollController _extendNestCtr = ScrollController();
@ -56,6 +57,8 @@ class _VideoDetailPageState extends State<VideoDetailPage>
late bool autoPlayEnable; late bool autoPlayEnable;
late bool autoPiP; late bool autoPiP;
final floating = Floating(); final floating = Floating();
// 生命周期监听
late final AppLifecycleListener _lifecycleListener;
@override @override
void initState() { void initState() {
@ -85,7 +88,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
videoSourceInit(); videoSourceInit();
appbarStreamListen(); appbarStreamListen();
WidgetsBinding.instance.addObserver(this); lifecycleListener();
} }
// 获取视频资源,初始化播放器 // 获取视频资源,初始化播放器
@ -159,6 +162,27 @@ class _VideoDetailPageState extends State<VideoDetailPage>
videoDetailController.isShowCover.value = false; videoDetailController.isShowCover.value = false;
} }
// 生命周期监听
void lifecycleListener() {
_lifecycleListener = AppLifecycleListener(
onResume: () => _handleTransition('resume'),
// 后台
onInactive: () => _handleTransition('inactive'),
// 在Android和iOS端不生效
onHide: () => _handleTransition('hide'),
onShow: () => _handleTransition('show'),
onPause: () => _handleTransition('pause'),
onRestart: () => _handleTransition('restart'),
onDetach: () => _handleTransition('detach'),
// 只作用于桌面端
onExitRequested: () {
ScaffoldMessenger.maybeOf(context)
?.showSnackBar(const SnackBar(content: Text("拦截应用退出")));
return Future.value(AppExitResponse.cancel);
},
);
}
@override @override
void dispose() { void dispose() {
if (plPlayerController != null) { if (plPlayerController != null) {
@ -169,8 +193,8 @@ class _VideoDetailPageState extends State<VideoDetailPage>
videoDetailController.floating!.dispose(); videoDetailController.floating!.dispose();
} }
videoPlayerServiceHandler.onVideoDetailDispose(); videoPlayerServiceHandler.onVideoDetailDispose();
WidgetsBinding.instance.removeObserver(this);
floating.dispose(); floating.dispose();
_lifecycleListener.dispose();
super.dispose(); super.dispose();
} }
@ -217,12 +241,21 @@ class _VideoDetailPageState extends State<VideoDetailPage>
.subscribe(this, ModalRoute.of(context) as PageRoute); .subscribe(this, ModalRoute.of(context) as PageRoute);
} }
@override void _handleTransition(String name) {
void didChangeAppLifecycleState(AppLifecycleState lifecycleState) { switch (name) {
case 'inactive':
autoEnterPip();
break;
}
}
void autoEnterPip() {
var routePath = Get.currentRoute; var routePath = Get.currentRoute;
if (lifecycleState == AppLifecycleState.inactive && bool isPortrait =
autoPiP && MediaQuery.of(context).orientation == Orientation.portrait;
routePath.startsWith('/video')) {
/// TODO 横屏全屏状态下误触pip
if (autoPiP && routePath.startsWith('/video') && isPortrait) {
floating.enable( floating.enable(
aspectRatio: Rational( aspectRatio: Rational(
videoDetailController.data.dash!.video!.first.width!, videoDetailController.data.dash!.video!.first.width!,