初始化

This commit is contained in:
谢宇宁
2026-09-15 15:44:13 +07:00
commit a23ba685e9
1065 changed files with 101122 additions and 0 deletions
+51
View File
@@ -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 属于调用方,这里不释放
}
}