opt: 视频加载异常捕获

This commit is contained in:
guozhigq
2024-07-08 23:44:39 +08:00
parent eb07460046
commit 24ca9209f8

View File

@ -1,16 +1,15 @@
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';
import 'package:flutter/services.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:lottie/lottie.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/http/user.dart'; import 'package:pilipala/http/user.dart';
import 'package:pilipala/models/common/search_type.dart'; import 'package:pilipala/models/common/search_type.dart';
@ -29,6 +28,7 @@ import 'package:status_bar_control/status_bar_control.dart';
import '../../../plugin/pl_player/models/bottom_control_type.dart'; import '../../../plugin/pl_player/models/bottom_control_type.dart';
import '../../../services/shutdown_timer_service.dart'; import '../../../services/shutdown_timer_service.dart';
import 'widgets/app_bar.dart'; import 'widgets/app_bar.dart';
import 'widgets/header_control.dart';
class VideoDetailPage extends StatefulWidget { class VideoDetailPage extends StatefulWidget {
const VideoDetailPage({Key? key}) : super(key: key); const VideoDetailPage({Key? key}) : super(key: key);
@ -494,45 +494,77 @@ class _VideoDetailPageState extends State<VideoDetailPage>
exitFullScreen(); exitFullScreen();
} }
Widget buildLoadingWidget() {
return Center(child: Lottie.asset('assets/loading.json', width: 200));
}
Widget buildVideoPlayerWidget(AsyncSnapshot snapshot) {
return Obx(() => !vdCtr.autoPlay.value
? const SizedBox()
: PLVideoPlayer(
controller: plPlayerController!,
headerControl: vdCtr.headerControl,
danmuWidget: PlDanmaku(
key: Key(vdCtr.danmakuCid.value.toString()),
cid: vdCtr.danmakuCid.value,
playerController: plPlayerController!,
),
bottomList: vdCtr.bottomList,
showEposideCb: () => vdCtr.videoType == SearchType.video
? videoIntroController.showEposideHandler()
: bangumiIntroController.showEposideHandler(),
fullScreenCb: (bool status) {
videoHeight.value =
status ? Get.size.height : defaultVideoHeight;
},
));
}
Widget buildErrorWidget(dynamic error) {
return Obx(
() => SizedBox(
height: videoHeight.value,
width: Get.size.width,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text('加载失败', style: TextStyle(color: Colors.white)),
Text('$error', style: const TextStyle(color: Colors.white)),
const SizedBox(height: 10),
IconButton.filled(
onPressed: () {
setState(() {
_futureBuilderFuture = vdCtr.queryVideoUrl();
});
},
icon: const Icon(Icons.refresh),
)
],
),
),
);
}
/// 播放器面板 /// 播放器面板
Widget videoPlayerPanel = FutureBuilder( Widget buildVideoPlayerPanel() {
future: _futureBuilderFuture, return FutureBuilder(
builder: (BuildContext context, AsyncSnapshot snapshot) { future: _futureBuilderFuture,
if (snapshot.hasData && snapshot.data['status']) { builder: (BuildContext context, AsyncSnapshot snapshot) {
return Obx( if (snapshot.connectionState == ConnectionState.waiting) {
() { return buildLoadingWidget();
return !vdCtr.autoPlay.value } else if (snapshot.connectionState == ConnectionState.done) {
? const SizedBox() if (snapshot.hasData && snapshot.data['status']) {
: Obx( return buildVideoPlayerWidget(snapshot);
() => PLVideoPlayer( } else {
controller: plPlayerController!, return buildErrorWidget(snapshot.error);
headerControl: vdCtr.headerControl, }
danmuWidget: PlDanmaku( } else {
key: Key(vdCtr.danmakuCid.value.toString()), return buildErrorWidget('未知错误');
cid: vdCtr.danmakuCid.value, }
playerController: plPlayerController!, },
), );
bottomList: vdCtr.bottomList, }
showEposideCb: () => vdCtr.videoType == SearchType.video
? videoIntroController.showEposideHandler()
: bangumiIntroController.showEposideHandler(),
fullScreenCb: (bool status) {
if (status) {
videoHeight.value = Get.size.height;
} else {
videoHeight.value = defaultVideoHeight;
}
},
),
);
},
);
} else {
// 加载失败异常处理
return const SizedBox();
}
},
);
Widget childWhenDisabled = SafeArea( Widget childWhenDisabled = SafeArea(
top: MediaQuery.of(context).orientation == Orientation.portrait && top: MediaQuery.of(context).orientation == Orientation.portrait &&
@ -721,7 +753,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
if (Platform.isAndroid) { if (Platform.isAndroid) {
return PiPSwitcher( return PiPSwitcher(
childWhenDisabled: childWhenDisabled, childWhenDisabled: childWhenDisabled,
childWhenEnabled: videoPlayerPanel, childWhenEnabled: buildVideoPlayerPanel(),
floating: floating, floating: floating,
); );
} else { } else {