fix: 3.13 生命周期监听
This commit is contained in:
@ -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!,
|
||||||
|
Reference in New Issue
Block a user