Merge branch 'main' into opt-followUp
This commit is contained in:
@ -626,4 +626,7 @@ class Api {
|
||||
/// 修复标题和海报
|
||||
// /api/view?id=${aid} /all/video/av${aid} /video/av${aid}/
|
||||
static const String fixTitleAndPic = '${HttpString.biliplusBaseUrl}/api/view';
|
||||
|
||||
/// 专栏详情
|
||||
static const String opusDetail = '/x/polymer/web-dynamic/v1/opus/detail';
|
||||
}
|
||||
|
||||
@ -215,4 +215,25 @@ class DynamicsHttp {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
static Future opusDetail({
|
||||
required int opusId,
|
||||
}) async {
|
||||
var res = await Request().get(
|
||||
Api.opusDetail,
|
||||
data: {'id': opusId},
|
||||
);
|
||||
if (res.data['code'] == 0) {
|
||||
return {
|
||||
'status': true,
|
||||
'data': res.data['data'],
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
'status': false,
|
||||
'data': [],
|
||||
'msg': res.data['message'],
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -216,6 +216,21 @@ class BuildMainApp extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Box setting = GStorage.setting;
|
||||
|
||||
/// 纯黑模式主题配置
|
||||
ColorScheme? pureDarkColorScheme;
|
||||
final bool enablePureBlack =
|
||||
setting.get(SettingBoxKey.enablePureBlack, defaultValue: false);
|
||||
if (enablePureBlack) {
|
||||
pureDarkColorScheme = darkColorScheme.copyWith(
|
||||
background: Colors.black,
|
||||
surface: Colors.black,
|
||||
onPrimary: Colors.black,
|
||||
onSecondary: Colors.black,
|
||||
);
|
||||
}
|
||||
|
||||
final SnackBarThemeData snackBarTheme = SnackBarThemeData(
|
||||
actionTextColor: lightColorScheme.primary,
|
||||
backgroundColor: lightColorScheme.secondaryContainer,
|
||||
@ -255,13 +270,13 @@ class BuildMainApp extends StatelessWidget {
|
||||
title: 'PiliPala',
|
||||
theme: buildThemeData(
|
||||
currentThemeValue == ThemeType.dark
|
||||
? darkColorScheme
|
||||
? pureDarkColorScheme ?? darkColorScheme
|
||||
: lightColorScheme,
|
||||
),
|
||||
darkTheme: buildThemeData(
|
||||
currentThemeValue == ThemeType.light
|
||||
? lightColorScheme
|
||||
: darkColorScheme,
|
||||
: pureDarkColorScheme ?? darkColorScheme,
|
||||
),
|
||||
localizationsDelegates: const [
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:pilipala/http/html.dart';
|
||||
import 'package:pilipala/http/dynamics.dart';
|
||||
import 'package:pilipala/http/reply.dart';
|
||||
import 'package:pilipala/models/common/reply_sort_type.dart';
|
||||
import 'package:pilipala/models/video/reply/item.dart';
|
||||
@ -12,6 +12,7 @@ class DynamicDetailController extends GetxController {
|
||||
DynamicDetailController(this.oid, this.type);
|
||||
int? oid;
|
||||
int? type;
|
||||
int? opusId;
|
||||
dynamic item;
|
||||
int? floor;
|
||||
String nextOffset = "";
|
||||
@ -56,6 +57,12 @@ class DynamicDetailController extends GetxController {
|
||||
if (reqType == 'init') {
|
||||
nextOffset = '';
|
||||
noMore.value = '';
|
||||
if (opusId != null && oid == 0) {
|
||||
var res = await DynamicsHttp.opusDetail(opusId: opusId!);
|
||||
if (res['status']) {
|
||||
oid = int.parse(res['data']['item']['basic']['comment_id_str']);
|
||||
}
|
||||
}
|
||||
}
|
||||
var res = await ReplyHttp.replyList(
|
||||
oid: oid!,
|
||||
@ -110,15 +117,12 @@ class DynamicDetailController extends GetxController {
|
||||
sortTypeTitle.value = _sortType.titles;
|
||||
sortTypeLabel.value = _sortType.labels;
|
||||
replyList.clear();
|
||||
noMore.value = '';
|
||||
isLoadingMore = false;
|
||||
isEnd = false;
|
||||
queryReplyList(reqType: 'init');
|
||||
}
|
||||
|
||||
// 根据jumpUrl获取动态html
|
||||
reqHtmlByOpusId(int id) async {
|
||||
var res = await HtmlHttp.reqHtml(id, 'opus');
|
||||
oid = res['commentId'];
|
||||
}
|
||||
|
||||
// 上拉加载
|
||||
Future onLoad() async {
|
||||
queryReplyList(reqType: 'onLoad');
|
||||
|
||||
@ -89,9 +89,8 @@ class _DynamicDetailPageState extends State<DynamicDetailPage>
|
||||
_dynamicDetailController = Get.put(
|
||||
DynamicDetailController(oid, replyType),
|
||||
tag: opusId.toString());
|
||||
_dynamicDetailController.opusId = opusId;
|
||||
_futureBuilderFuture = _dynamicDetailController.queryReplyList();
|
||||
await _dynamicDetailController.reqHtmlByOpusId(opusId!);
|
||||
setState(() {});
|
||||
}
|
||||
} else {
|
||||
oid = moduleDynamic.major!.draw!.id!;
|
||||
|
||||
@ -194,7 +194,10 @@ class _LivePageState extends State<LivePage>
|
||||
),
|
||||
),
|
||||
),
|
||||
InkWell(
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: _liveController.liveFollowingCount.value > 0,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
Get.toNamed('/liveFollowing');
|
||||
},
|
||||
@ -216,25 +219,26 @@ class _LivePageState extends State<LivePage>
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
FutureBuilder(
|
||||
future: _futureBuilderFuture2,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done) {
|
||||
if (snapshot.data == null) {
|
||||
return const SizedBox();
|
||||
}
|
||||
Map? data = snapshot.data;
|
||||
if (data?['status']) {
|
||||
if (data != null && data['status']) {
|
||||
RxList list = _liveController.liveFollowingList;
|
||||
return LiveFollowingListView(list: list);
|
||||
return list.isNotEmpty
|
||||
? LiveFollowingListView(list: list)
|
||||
: const Center(child: Text('没有人在直播'));
|
||||
} else {
|
||||
return SizedBox(
|
||||
height: 80,
|
||||
child: Center(
|
||||
child: Text(
|
||||
data?['msg'] ?? '',
|
||||
data?['msg'] ?? '请求异常',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.outline,
|
||||
fontSize: 12,
|
||||
@ -283,6 +287,15 @@ class LiveFollowingListView extends StatelessWidget {
|
||||
},
|
||||
);
|
||||
},
|
||||
onLongPress: () {
|
||||
Get.toNamed(
|
||||
'/member?mid=${list[index].uid}',
|
||||
arguments: {
|
||||
'face': list[index].face,
|
||||
'heroTag': list[index].uid.toString(),
|
||||
},
|
||||
);
|
||||
},
|
||||
child: Container(
|
||||
width: 54,
|
||||
height: 54,
|
||||
|
||||
@ -9,7 +9,7 @@ class LiveFollowController extends GetxController {
|
||||
RxInt crossAxisCount = 2.obs;
|
||||
Box setting = GStorage.setting;
|
||||
int _currentPage = 1;
|
||||
RxInt liveFollowingCount = 0.obs;
|
||||
RxString liveFollowingCount = '- '.obs;
|
||||
RxList<LiveFollowingItemModel> liveFollowingList =
|
||||
<LiveFollowingItemModel>[].obs;
|
||||
|
||||
@ -28,10 +28,11 @@ class LiveFollowController extends GetxController {
|
||||
if (res['status']) {
|
||||
if (type == 'init') {
|
||||
liveFollowingList.value = res['data'].list;
|
||||
liveFollowingCount.value = res['data'].liveCount;
|
||||
liveFollowingCount.value = res['data'].liveCount.toString();
|
||||
} else if (type == 'onLoad') {
|
||||
liveFollowingList.addAll(res['data'].list);
|
||||
}
|
||||
liveFollowingList.removeWhere((e) => e.liveStatus != 1);
|
||||
_currentPage += 1;
|
||||
} else {
|
||||
SmartDialog.showToast(res['msg']);
|
||||
|
||||
@ -110,7 +110,8 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
Widget build(BuildContext context) {
|
||||
final mediaQuery = MediaQuery.of(context);
|
||||
final isPortrait = mediaQuery.orientation == Orientation.portrait;
|
||||
final isLandscape = mediaQuery.orientation == Orientation.landscape;
|
||||
final RxBool isLandscape =
|
||||
(mediaQuery.orientation == Orientation.landscape).obs;
|
||||
|
||||
final padding = mediaQuery.padding;
|
||||
|
||||
@ -194,7 +195,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
Obx(
|
||||
() => SizedBox(
|
||||
height: padding.top +
|
||||
(_liveRoomController.isPortrait.value || isLandscape
|
||||
(_liveRoomController.isPortrait.value || isLandscape.value
|
||||
? 0
|
||||
: kToolbarHeight),
|
||||
),
|
||||
@ -205,14 +206,14 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
if (plPlayerController.isFullScreen.value == true) {
|
||||
plPlayerController.triggerFullScreen(status: false);
|
||||
}
|
||||
if (isLandscape) {
|
||||
if (isLandscape.value) {
|
||||
verticalScreen();
|
||||
}
|
||||
},
|
||||
child: Obx(
|
||||
() => Container(
|
||||
width: Get.size.width,
|
||||
height: isLandscape
|
||||
height: isLandscape.value
|
||||
? Get.size.height
|
||||
: !_liveRoomController.isPortrait.value
|
||||
? Get.size.width * 9 / 16
|
||||
@ -313,7 +314,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
),
|
||||
// 消息列表
|
||||
Visibility(
|
||||
visible: !isLandscape,
|
||||
visible: !isLandscape.value,
|
||||
child: Obx(
|
||||
() => Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
|
||||
@ -249,6 +249,15 @@ class _StyleSettingState extends State<StyleSetting> {
|
||||
'当前模式:${settingController.themeType.value.description}',
|
||||
style: subTitleStyle)),
|
||||
),
|
||||
SetSwitchItem(
|
||||
title: '纯黑模式',
|
||||
subTitle: '深色模式时使用纯黑色背景,适用于OLED屏幕',
|
||||
setKey: SettingBoxKey.enablePureBlack,
|
||||
defaultVal: false,
|
||||
callFn: (bool val) => {
|
||||
if (val && Get.isDarkMode) {Get.appUpdate()}
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
dense: false,
|
||||
onTap: () => settingController.setDynamicBadgeMode(context),
|
||||
|
||||
@ -276,7 +276,7 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
|
||||
WidgetSpan(
|
||||
child: Visibility(
|
||||
visible: widget.videoDetail!.copyright == 2,
|
||||
child: const PBadge(text: '转载', type: 'color'),
|
||||
child: const PBadge(text: '转载', type: 'color', stack: 'relative'),
|
||||
),
|
||||
),
|
||||
const TextSpan(text: ' '),
|
||||
|
||||
@ -73,7 +73,7 @@ class VideoReplyController extends GetxController {
|
||||
/// 临时修复
|
||||
final bool flag = replyList
|
||||
.any((ReplyItemModel reply) => reply.rpid == replies.first.rpid);
|
||||
if (replies.length == 1 && flag) {
|
||||
if (replies.length == 1 && flag && type == 'onLoad') {
|
||||
replies.clear();
|
||||
isEnd = true;
|
||||
}
|
||||
|
||||
@ -196,7 +196,7 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
|
||||
future: _futureBuilderFuture,
|
||||
builder: (BuildContext context, snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done) {
|
||||
var data = snapshot.data;
|
||||
Map? data = snapshot.data;
|
||||
if (_videoReplyController.replyList.isNotEmpty ||
|
||||
(data != null && data['status'])) {
|
||||
// 请求成功
|
||||
@ -258,7 +258,7 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
|
||||
} else {
|
||||
// 请求错误
|
||||
return HttpError(
|
||||
errMsg: data['msg'],
|
||||
errMsg: data?['msg'] ?? '请求异常',
|
||||
fn: () {
|
||||
setState(() {
|
||||
_futureBuilderFuture =
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
||||
import 'package:floating/floating.dart';
|
||||
@ -76,7 +77,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
getStatusHeight();
|
||||
heroTag = Get.arguments['heroTag'];
|
||||
vdCtr = Get.put(VideoDetailController(), tag: heroTag);
|
||||
vdCtr.sheetHeight.value = localCache.get('sheetHeight');
|
||||
vdCtr.sheetHeight.value = GlobalDataCache.sheetHeight;
|
||||
videoIntroController = Get.put(
|
||||
VideoIntroController(bvid: Get.parameters['bvid']!),
|
||||
tag: heroTag);
|
||||
@ -223,8 +224,8 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
void _extendNestCtrListener() {
|
||||
final double offset = _extendNestCtr.position.pixels;
|
||||
if (vdCtr.videoDirection.value == 'horizontal') {
|
||||
vdCtr.sheetHeight.value =
|
||||
Get.size.height - videoHeight - statusBarHeight + offset;
|
||||
vdCtr.sheetHeight.value = max(GlobalDataCache.sheetHeight,
|
||||
Get.size.height - videoHeight - statusBarHeight + offset);
|
||||
appbarStream.add(offset);
|
||||
} else {
|
||||
if (offset > (Get.size.width * 22 / 16 - videoHeight)) {
|
||||
|
||||
@ -1068,13 +1068,10 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
);
|
||||
final bool isLandscape =
|
||||
MediaQuery.of(context).orientation == Orientation.landscape;
|
||||
return AppBar(
|
||||
backgroundColor: Colors.transparent,
|
||||
foregroundColor: Colors.white,
|
||||
primary: false,
|
||||
automaticallyImplyLeading: false,
|
||||
titleSpacing: 14,
|
||||
title: Column(
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 14),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
if (isFullScreen.value && isLandscape) ...[
|
||||
Row(
|
||||
@ -1083,10 +1080,7 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
if (videoIntroController.isShowOnlineTotal)
|
||||
Text(
|
||||
'${videoIntroController.total.value}人正在看',
|
||||
style: const TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 12,
|
||||
),
|
||||
style: textStyle,
|
||||
),
|
||||
const Spacer(),
|
||||
Expanded(
|
||||
@ -1097,18 +1091,12 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
String currentTime = _formatTime(snapshot.data!);
|
||||
return Text(
|
||||
currentTime,
|
||||
style: const TextStyle(fontSize: 12),
|
||||
);
|
||||
return Text(currentTime, style: textStyle);
|
||||
} else if (snapshot.connectionState ==
|
||||
ConnectionState.waiting) {
|
||||
// 如果Stream还未发出数据,先显示初始获取的时间
|
||||
String currentTime = _formatTime(initialTime);
|
||||
return Text(
|
||||
currentTime,
|
||||
style: const TextStyle(fontSize: 12),
|
||||
);
|
||||
return Text(currentTime, style: textStyle);
|
||||
} else {
|
||||
return const SizedBox();
|
||||
}
|
||||
@ -1159,7 +1147,8 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
() => Marquee(
|
||||
text: videoIntroController.videoDetail.value.title ??
|
||||
'',
|
||||
style: const TextStyle(fontSize: 16),
|
||||
style: const TextStyle(
|
||||
fontSize: 16, color: Colors.white),
|
||||
scrollAxis: Axis.horizontal,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
blankSpace: constraints.maxWidth,
|
||||
|
||||
@ -45,6 +45,7 @@ class WhisperController extends GetxController {
|
||||
if (isLoading) return;
|
||||
var res = await MsgHttp.sessionList(
|
||||
endTs: type == 'onLoad' ? sessionList.last.sessionTs : null);
|
||||
try {
|
||||
if (res['status'] &&
|
||||
res['data'].sessionList != null &&
|
||||
res['data'].sessionList.isNotEmpty) {
|
||||
@ -75,6 +76,13 @@ class WhisperController extends GetxController {
|
||||
sessionList.value = res['data'].sessionList;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
res = {
|
||||
'status': false,
|
||||
'message': err.toString(),
|
||||
};
|
||||
}
|
||||
|
||||
isLoading = false;
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -44,7 +44,24 @@ class _WhisperPageState extends State<WhisperPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text('消息')),
|
||||
appBar: AppBar(
|
||||
title: const Text('消息'),
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: Icon(Icons.open_in_browser_rounded,
|
||||
color: Theme.of(context).colorScheme.primary),
|
||||
tooltip: '用浏览器打开',
|
||||
onPressed: () {
|
||||
Get.toNamed('/webview', parameters: {
|
||||
'url': 'https://message.bilibili.com',
|
||||
'type': 'whisper',
|
||||
'pageTitle': '消息中心',
|
||||
});
|
||||
},
|
||||
),
|
||||
const SizedBox(width: 12)
|
||||
],
|
||||
),
|
||||
body: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
_whisperController.unread();
|
||||
|
||||
@ -521,6 +521,7 @@ class SystemNotice extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Map content = item.content ?? '';
|
||||
Color primary = Theme.of(context).colorScheme.primary;
|
||||
return Row(
|
||||
children: [
|
||||
const SizedBox(width: 12),
|
||||
@ -557,12 +558,35 @@ class SystemNotice extends StatelessWidget {
|
||||
.labelSmall!
|
||||
.copyWith(color: Theme.of(context).colorScheme.outline),
|
||||
),
|
||||
Divider(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0.05),
|
||||
Divider(color: primary.withOpacity(0.05)),
|
||||
SelectableText(content['text']),
|
||||
if (content['jump_text'] != null &&
|
||||
content['jump_uri'] != null) ...[
|
||||
Divider(color: primary.withOpacity(0.05)),
|
||||
Align(
|
||||
alignment: Alignment.center,
|
||||
child: TextButton(
|
||||
onPressed: () {
|
||||
Get.toNamed('/webview', parameters: {
|
||||
'url': content['jump_uri'],
|
||||
'type': 'url',
|
||||
'pageTitle': content['jump_text'] == ''
|
||||
? '查看详情'
|
||||
: content['jump_text'],
|
||||
});
|
||||
},
|
||||
style: ButtonStyle(
|
||||
backgroundColor:
|
||||
MaterialStateProperty.resolveWith((states) {
|
||||
return primary.withAlpha(20);
|
||||
}),
|
||||
),
|
||||
SelectableText(
|
||||
content['text'],
|
||||
)
|
||||
child: Text(content['jump_text'] == ''
|
||||
? '查看详情'
|
||||
: content['jump_text']),
|
||||
),
|
||||
),
|
||||
]
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@ -292,10 +292,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
style: ButtonStyle(
|
||||
padding: MaterialStateProperty.all(EdgeInsets.zero),
|
||||
),
|
||||
child: const Text(
|
||||
'选集',
|
||||
style: TextStyle(color: Colors.white, fontSize: 13),
|
||||
),
|
||||
child: const Text('选集', style: textStyle),
|
||||
),
|
||||
),
|
||||
|
||||
@ -310,14 +307,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
padding: MaterialStateProperty.all(EdgeInsets.zero),
|
||||
),
|
||||
child: Obx(
|
||||
() => Text(
|
||||
_.videoFitDEsc.value,
|
||||
style: const TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
() => Text(_.videoFitDEsc.value, style: textStyle),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -339,10 +329,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
height: 40,
|
||||
padding: const EdgeInsets.only(left: 20),
|
||||
value: speed,
|
||||
child: Text(
|
||||
'${speed}x',
|
||||
style: textStyle.copyWith(fontWeight: FontWeight.bold),
|
||||
),
|
||||
child: Text('${speed}x', style: textStyle),
|
||||
);
|
||||
}).toList();
|
||||
},
|
||||
@ -352,10 +339,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
alignment: Alignment.center,
|
||||
margin: const EdgeInsets.only(right: 4),
|
||||
child: Obx(
|
||||
() => Text(
|
||||
'${_.playbackSpeed.toString()}x',
|
||||
style: textStyle.copyWith(fontWeight: FontWeight.bold),
|
||||
),
|
||||
() => Text('${_.playbackSpeed.toString()}x', style: textStyle),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -443,7 +427,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
color: Colors.white,
|
||||
fontSize: 12,
|
||||
);
|
||||
return Stack(
|
||||
return ClipRect(
|
||||
child: Stack(
|
||||
fit: StackFit.passthrough,
|
||||
children: <Widget>[
|
||||
Obx(
|
||||
@ -719,7 +704,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
_brightnessValue.value - delta / level;
|
||||
final double result = brightness.clamp(0.0, 1.0);
|
||||
setBrightness(result);
|
||||
} else if (isUsingFullScreenGestures(tapPosition, sectionWidth)) {
|
||||
} else if (isUsingFullScreenGestures(
|
||||
tapPosition, sectionWidth)) {
|
||||
// 全屏
|
||||
final double dy = details.delta.dy;
|
||||
const double threshold = 7.0; // 滑动阈值
|
||||
@ -770,9 +756,9 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
() => Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
if (widget.headerControl != null || _.headerControl != null) ...[
|
||||
if (widget.headerControl != null ||
|
||||
_.headerControl != null) ...[
|
||||
Flexible(
|
||||
child: ClipRect(
|
||||
child: AppBarAni(
|
||||
controller: animationController,
|
||||
visible: !_.controlsLock.value && _.showControls.value,
|
||||
@ -780,13 +766,11 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
child: widget.headerControl ?? _.headerControl!,
|
||||
),
|
||||
),
|
||||
),
|
||||
] else ...[
|
||||
const SizedBox.shrink()
|
||||
],
|
||||
Flexible(
|
||||
flex: _.videoType == 'live' ? 0 : 1,
|
||||
child: ClipRect(
|
||||
child: AppBarAni(
|
||||
controller: animationController,
|
||||
visible: !_.controlsLock.value && _.showControls.value,
|
||||
@ -799,7 +783,6 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -934,6 +917,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
onSubmittedcb: _handleSubmittedCallback,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,19 +18,18 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
color: Colors.transparent,
|
||||
height: 90,
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 18),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(7, 0, 7, 6),
|
||||
padding: const EdgeInsets.fromLTRB(7, 0, 7, 4),
|
||||
child: ProgressBarWidget(controller: controller!),
|
||||
),
|
||||
Row(children: buildBottomControl!),
|
||||
const SizedBox(height: 10),
|
||||
const SizedBox(height: 6),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@ -137,7 +137,8 @@ class SettingBoxKey {
|
||||
enableGradientBg = 'enableGradientBg',
|
||||
enableDynamicSwitch = 'enableDynamicSwitch',
|
||||
navBarSort = 'navBarSort',
|
||||
actionTypeSort = 'actionTypeSort';
|
||||
actionTypeSort = 'actionTypeSort',
|
||||
enablePureBlack = 'enablePureBlack';
|
||||
}
|
||||
|
||||
class LocalCacheKey {
|
||||
|
||||
Reference in New Issue
Block a user