opt: pages

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-02 20:34:05 +08:00
parent f1a10a786d
commit 621239551f
22 changed files with 227 additions and 191 deletions

View File

@@ -8,6 +8,7 @@ import 'package:PiliPalaX/common/widgets/pair.dart';
import 'package:PiliPalaX/common/widgets/segment_progress_bar.dart';
import 'package:PiliPalaX/http/danmaku.dart';
import 'package:PiliPalaX/http/init.dart';
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:PiliPalaX/http/user.dart';
import 'package:PiliPalaX/models/video/later.dart';
import 'package:PiliPalaX/models/video/play/subtitle.dart';
@@ -162,12 +163,10 @@ class VideoDetailController extends GetxController
/// tabs相关配置
int tabInitialIndex = 0;
late TabController tabCtr;
RxList<String> tabs = <String>['简介', '评论'].obs;
// 请求返回的视频信息
late PlayUrlModel data;
// 请求状态
RxBool isLoading = false.obs;
Rx<LoadingState> videoState = LoadingState.loading().obs;
/// 播放器配置 画质 音质 解码格式
late VideoQuality currentVideoQa;
@@ -175,8 +174,6 @@ class VideoDetailController extends GetxController
late VideoDecodeFormats currentDecodeFormats;
// 是否开始自动播放 存在多p的情况下第二p需要为true
RxBool autoPlay = true.obs;
// 视频资源是否有效
RxBool isEffective = true.obs;
// 封面图的展示
RxBool isShowCover = true.obs;
// 硬解
@@ -1061,8 +1058,13 @@ class VideoDetailController extends GetxController
plPlayerController.headerControl = headerControl;
}
bool isQuerying = false;
// 视频链接
Future queryVideoUrl() async {
if (isQuerying) {
return;
}
isQuerying = true;
if (cacheVideoQa == null) {
await Connectivity().checkConnectivity().then((res) {
cacheVideoQa = res.contains(ConnectivityResult.wifi)
@@ -1226,7 +1228,8 @@ class VideoDetailController extends GetxController
SmartDialog.showToast("错误(${result['code']}${result['msg']}");
}
}
return result;
isQuerying = false;
videoState.value = LoadingState.success(null);
}
List<PostSegmentModel>? list;

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math';
import 'package:PiliPalaX/http/loading_state.dart';
import 'package:PiliPalaX/utils/extension.dart';
import 'package:PiliPalaX/utils/utils.dart';
import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart';
@@ -146,7 +147,8 @@ class VideoIntroController extends GetxController
final videoDetailController =
Get.find<VideoDetailController>(tag: heroTag);
if (videoDetailController.videoItem['pic'] == null ||
videoDetailController.videoItem['pic'] == '') {
videoDetailController.videoItem['pic'] == '' ||
videoDetailController.videoUrl.isNullOrEmpty) {
videoDetailController.videoItem['pic'] = result['data'].pic;
}
} catch (_) {}

View File

@@ -653,6 +653,10 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
videoIntroController
.queryVideoIntroData.value["status"] = true;
videoIntroController.queryVideoIntro();
if (videoDetailCtr.videoUrl.isNullOrEmpty &&
videoDetailCtr.isQuerying.not) {
videoDetailCtr.queryVideoUrl();
}
},
label: const Text("点此重新加载"),
),

View File

@@ -73,7 +73,6 @@ class _VideoDetailPageState extends State<VideoDetailPage>
double doubleOffset = 0;
late Future _futureBuilderFuture;
// 自动退出全屏
late bool autoExitFullscreen;
late bool autoPlayEnable;
@@ -194,7 +193,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
// 获取视频资源,初始化播放器
Future<void> videoSourceInit() async {
_futureBuilderFuture = videoDetailController.queryVideoUrl();
videoDetailController.queryVideoUrl();
if (videoDetailController.showReply) {
_videoReplyController.queryData();
}
@@ -289,6 +288,9 @@ class _VideoDetailPageState extends State<VideoDetailPage>
videoDetailController.audioUrl == null) {
// SmartDialog.showToast('not initialized');
debugPrint('not initialized');
if (videoDetailController.isQuerying.not) {
videoDetailController.queryVideoUrl();
}
return;
}
plPlayerController = videoDetailController.plPlayerController;
@@ -985,8 +987,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
Widget get manualPlayerWidget => Obx(
() => Visibility(
visible: videoDetailController.isShowCover.value &&
videoDetailController.isEffective.value,
visible: videoDetailController.isShowCover.value,
child: Stack(
children: [
Positioned(
@@ -1084,42 +1085,35 @@ class _VideoDetailPageState extends State<VideoDetailPage>
),
);
Widget get plPlayer => FutureBuilder(
future: _futureBuilderFuture,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData && snapshot.data['status']) {
return Obx(
() => !videoDetailController.autoPlay.value ||
plPlayerController == null ||
plPlayerController!.videoController == null
? nil
: PLVideoPlayer(
plPlayerController: plPlayerController!,
videoIntroController:
videoDetailController.videoType == SearchType.video
? videoIntroController
: null,
bangumiIntroController: videoDetailController.videoType ==
SearchType.media_bangumi
? bangumiIntroController
: null,
headerControl: videoDetailController.headerControl,
danmuWidget: Obx(
() => PlDanmaku(
key: Key(videoDetailController.danmakuCid.value
.toString()),
cid: videoDetailController.danmakuCid.value,
playerController: plPlayerController!,
),
Widget get plPlayer => Obx(
() => videoDetailController.videoState.value is! Success
? nil
: !videoDetailController.autoPlay.value ||
plPlayerController == null ||
plPlayerController!.videoController == null
? nil
: PLVideoPlayer(
plPlayerController: plPlayerController!,
videoIntroController:
videoDetailController.videoType == SearchType.video
? videoIntroController
: null,
bangumiIntroController: videoDetailController.videoType ==
SearchType.media_bangumi
? bangumiIntroController
: null,
headerControl: videoDetailController.headerControl,
danmuWidget: Obx(
() => PlDanmaku(
key: Key(
videoDetailController.danmakuCid.value.toString()),
cid: videoDetailController.danmakuCid.value,
playerController: plPlayerController!,
),
showEpisodes: showEpisodes,
showViewPoints: showViewPoints,
),
);
} else {
return const SizedBox();
}
},
showEpisodes: showEpisodes,
showViewPoints: showViewPoints,
),
);
Widget autoChoose(Widget childWhenDisabled) {