初始化
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:video_player/video_player.dart';
|
||||
|
||||
/// 全屏播放页业务逻辑:横竖屏切换 + 后台自动暂停
|
||||
/// 注:[playCtr] 由外部页面持有并释放,本类只借用,绝不能 dispose
|
||||
class VideoFullLogic extends GetxController with WidgetsBindingObserver {
|
||||
VideoFullLogic({required this.playCtr, this.isAutoV = true});
|
||||
|
||||
final VideoPlayerController playCtr;
|
||||
final bool isAutoV; // true:按视频比例决定是否转横屏;false:强制转横屏
|
||||
|
||||
double get aspectRatio => playCtr.value.aspectRatio;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
// 横向视频(或调用方强制)才转横屏,竖屏视频保持竖屏全屏
|
||||
if (aspectRatio > 1 || !isAutoV) {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]);
|
||||
SystemChrome.setPreferredOrientations([
|
||||
DeviceOrientation.landscapeLeft,
|
||||
DeviceOrientation.landscapeRight,
|
||||
]);
|
||||
}
|
||||
// 转屏后 Get.width/height 才是新值,下一帧刷一次让画面按新尺寸铺满
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) => update());
|
||||
}
|
||||
|
||||
/// 切后台暂停,防止息屏/切走后声音还在外放
|
||||
@override
|
||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||
super.didChangeAppLifecycleState(state);
|
||||
if (state == AppLifecycleState.paused) playCtr.pause();
|
||||
}
|
||||
|
||||
/// 退出全屏:恢复竖屏 + 状态栏,再退页
|
||||
void exitFullScreen() {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom, SystemUiOverlay.top]);
|
||||
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
|
||||
Get.back();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
super.onClose(); // playCtr 属于调用方,这里不释放
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user