Merge branch 'main' into design

This commit is contained in:
guozhigq
2024-12-09 09:40:56 +08:00
12 changed files with 508 additions and 461 deletions

View File

@ -626,4 +626,7 @@ class Api {
/// 修复标题和海报 /// 修复标题和海报
// /api/view?id=${aid} /all/video/av${aid} /video/av${aid}/ // /api/view?id=${aid} /all/video/av${aid} /video/av${aid}/
static const String fixTitleAndPic = '${HttpString.biliplusBaseUrl}/api/view'; static const String fixTitleAndPic = '${HttpString.biliplusBaseUrl}/api/view';
/// 专栏详情
static const String opusDetail = '/x/polymer/web-dynamic/v1/opus/detail';
} }

View File

@ -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'],
};
}
}
} }

View File

@ -216,6 +216,21 @@ class BuildMainApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { 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( final SnackBarThemeData snackBarTheme = SnackBarThemeData(
actionTextColor: lightColorScheme.primary, actionTextColor: lightColorScheme.primary,
backgroundColor: lightColorScheme.secondaryContainer, backgroundColor: lightColorScheme.secondaryContainer,
@ -255,13 +270,13 @@ class BuildMainApp extends StatelessWidget {
title: 'PiliPala', title: 'PiliPala',
theme: buildThemeData( theme: buildThemeData(
currentThemeValue == ThemeType.dark currentThemeValue == ThemeType.dark
? darkColorScheme ? pureDarkColorScheme ?? darkColorScheme
: lightColorScheme, : lightColorScheme,
), ),
darkTheme: buildThemeData( darkTheme: buildThemeData(
currentThemeValue == ThemeType.light currentThemeValue == ThemeType.light
? lightColorScheme ? lightColorScheme
: darkColorScheme, : pureDarkColorScheme ?? darkColorScheme,
), ),
localizationsDelegates: const [ localizationsDelegates: const [
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.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/http/reply.dart';
import 'package:pilipala/models/common/reply_sort_type.dart'; import 'package:pilipala/models/common/reply_sort_type.dart';
import 'package:pilipala/models/video/reply/item.dart'; import 'package:pilipala/models/video/reply/item.dart';
@ -12,6 +12,7 @@ class DynamicDetailController extends GetxController {
DynamicDetailController(this.oid, this.type); DynamicDetailController(this.oid, this.type);
int? oid; int? oid;
int? type; int? type;
int? opusId;
dynamic item; dynamic item;
int? floor; int? floor;
String nextOffset = ""; String nextOffset = "";
@ -56,6 +57,12 @@ class DynamicDetailController extends GetxController {
if (reqType == 'init') { if (reqType == 'init') {
nextOffset = ''; nextOffset = '';
noMore.value = ''; 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( var res = await ReplyHttp.replyList(
oid: oid!, oid: oid!,
@ -110,15 +117,12 @@ class DynamicDetailController extends GetxController {
sortTypeTitle.value = _sortType.titles; sortTypeTitle.value = _sortType.titles;
sortTypeLabel.value = _sortType.labels; sortTypeLabel.value = _sortType.labels;
replyList.clear(); replyList.clear();
noMore.value = '';
isLoadingMore = false;
isEnd = false;
queryReplyList(reqType: 'init'); queryReplyList(reqType: 'init');
} }
// 根据jumpUrl获取动态html
reqHtmlByOpusId(int id) async {
var res = await HtmlHttp.reqHtml(id, 'opus');
oid = res['commentId'];
}
// 上拉加载 // 上拉加载
Future onLoad() async { Future onLoad() async {
queryReplyList(reqType: 'onLoad'); queryReplyList(reqType: 'onLoad');

View File

@ -89,9 +89,8 @@ class _DynamicDetailPageState extends State<DynamicDetailPage>
_dynamicDetailController = Get.put( _dynamicDetailController = Get.put(
DynamicDetailController(oid, replyType), DynamicDetailController(oid, replyType),
tag: opusId.toString()); tag: opusId.toString());
_dynamicDetailController.opusId = opusId;
_futureBuilderFuture = _dynamicDetailController.queryReplyList(); _futureBuilderFuture = _dynamicDetailController.queryReplyList();
await _dynamicDetailController.reqHtmlByOpusId(opusId!);
setState(() {});
} }
} else { } else {
oid = moduleDynamic.major!.draw!.id!; oid = moduleDynamic.major!.draw!.id!;

View File

@ -110,7 +110,8 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Widget build(BuildContext context) { Widget build(BuildContext context) {
final mediaQuery = MediaQuery.of(context); final mediaQuery = MediaQuery.of(context);
final isPortrait = mediaQuery.orientation == Orientation.portrait; final isPortrait = mediaQuery.orientation == Orientation.portrait;
final isLandscape = mediaQuery.orientation == Orientation.landscape; final RxBool isLandscape =
(mediaQuery.orientation == Orientation.landscape).obs;
final padding = mediaQuery.padding; final padding = mediaQuery.padding;
@ -194,7 +195,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Obx( Obx(
() => SizedBox( () => SizedBox(
height: padding.top + height: padding.top +
(_liveRoomController.isPortrait.value || isLandscape (_liveRoomController.isPortrait.value || isLandscape.value
? 0 ? 0
: kToolbarHeight), : kToolbarHeight),
), ),
@ -205,14 +206,14 @@ class _LiveRoomPageState extends State<LiveRoomPage>
if (plPlayerController.isFullScreen.value == true) { if (plPlayerController.isFullScreen.value == true) {
plPlayerController.triggerFullScreen(status: false); plPlayerController.triggerFullScreen(status: false);
} }
if (isLandscape) { if (isLandscape.value) {
verticalScreen(); verticalScreen();
} }
}, },
child: Obx( child: Obx(
() => Container( () => Container(
width: Get.size.width, width: Get.size.width,
height: isLandscape height: isLandscape.value
? Get.size.height ? Get.size.height
: !_liveRoomController.isPortrait.value : !_liveRoomController.isPortrait.value
? Get.size.width * 9 / 16 ? Get.size.width * 9 / 16
@ -313,7 +314,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
), ),
// 消息列表 // 消息列表
Visibility( Visibility(
visible: !isLandscape, visible: !isLandscape.value,
child: Obx( child: Obx(
() => Align( () => Align(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,

View File

@ -249,6 +249,15 @@ class _StyleSettingState extends State<StyleSetting> {
'当前模式:${settingController.themeType.value.description}', '当前模式:${settingController.themeType.value.description}',
style: subTitleStyle)), style: subTitleStyle)),
), ),
SetSwitchItem(
title: '纯黑模式',
subTitle: '深色模式时使用纯黑色背景适用于OLED屏幕',
setKey: SettingBoxKey.enablePureBlack,
defaultVal: false,
callFn: (bool val) => {
if (val && Get.isDarkMode) {Get.appUpdate()}
},
),
ListTile( ListTile(
dense: false, dense: false,
onTap: () => settingController.setDynamicBadgeMode(context), onTap: () => settingController.setDynamicBadgeMode(context),

View File

@ -73,7 +73,7 @@ class VideoReplyController extends GetxController {
/// 临时修复 /// 临时修复
final bool flag = replyList final bool flag = replyList
.any((ReplyItemModel reply) => reply.rpid == replies.first.rpid); .any((ReplyItemModel reply) => reply.rpid == replies.first.rpid);
if (replies.length == 1 && flag) { if (replies.length == 1 && flag && type == 'onLoad') {
replies.clear(); replies.clear();
isEnd = true; isEnd = true;
} }

View File

@ -1068,13 +1068,10 @@ class _HeaderControlState extends State<HeaderControl> {
); );
final bool isLandscape = final bool isLandscape =
MediaQuery.of(context).orientation == Orientation.landscape; MediaQuery.of(context).orientation == Orientation.landscape;
return AppBar( return Padding(
backgroundColor: Colors.transparent, padding: const EdgeInsets.symmetric(horizontal: 14),
foregroundColor: Colors.white, child: Column(
primary: false, mainAxisSize: MainAxisSize.min,
automaticallyImplyLeading: false,
titleSpacing: 14,
title: Column(
children: [ children: [
if (isFullScreen.value && isLandscape) ...[ if (isFullScreen.value && isLandscape) ...[
Row( Row(

View File

@ -443,7 +443,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
color: Colors.white, color: Colors.white,
fontSize: 12, fontSize: 12,
); );
return Stack( return ClipRect(
child: Stack(
fit: StackFit.passthrough, fit: StackFit.passthrough,
children: <Widget>[ children: <Widget>[
Obx( Obx(
@ -719,7 +720,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
_brightnessValue.value - delta / level; _brightnessValue.value - delta / level;
final double result = brightness.clamp(0.0, 1.0); final double result = brightness.clamp(0.0, 1.0);
setBrightness(result); setBrightness(result);
} else if (isUsingFullScreenGestures(tapPosition, sectionWidth)) { } else if (isUsingFullScreenGestures(
tapPosition, sectionWidth)) {
// 全屏 // 全屏
final double dy = details.delta.dy; final double dy = details.delta.dy;
const double threshold = 7.0; // 滑动阈值 const double threshold = 7.0; // 滑动阈值
@ -732,7 +734,6 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
lastFullScreenToggleTime = DateTime.now(); lastFullScreenToggleTime = DateTime.now();
// 下滑退出全屏 // 下滑退出全屏
await widget.controller.triggerFullScreen(status: flag); await widget.controller.triggerFullScreen(status: flag);
widget.fullScreenCb?.call(flag);
} }
_distance.value = 0.0; _distance.value = 0.0;
} else if (dy < _distance.value && } else if (dy < _distance.value &&
@ -742,7 +743,6 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
lastFullScreenToggleTime = DateTime.now(); lastFullScreenToggleTime = DateTime.now();
// 上滑进入全屏 // 上滑进入全屏
await widget.controller.triggerFullScreen(status: !flag); await widget.controller.triggerFullScreen(status: !flag);
widget.fullScreenCb?.call(!flag);
} }
_distance.value = 0.0; _distance.value = 0.0;
} }
@ -770,9 +770,9 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
() => Column( () => Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
if (widget.headerControl != null || _.headerControl != null) ...[ if (widget.headerControl != null ||
_.headerControl != null) ...[
Flexible( Flexible(
child: ClipRect(
child: AppBarAni( child: AppBarAni(
controller: animationController, controller: animationController,
visible: !_.controlsLock.value && _.showControls.value, visible: !_.controlsLock.value && _.showControls.value,
@ -780,13 +780,11 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
child: widget.headerControl ?? _.headerControl!, child: widget.headerControl ?? _.headerControl!,
), ),
), ),
),
] else ...[ ] else ...[
const SizedBox.shrink() const SizedBox.shrink()
], ],
Flexible( Flexible(
flex: _.videoType == 'live' ? 0 : 1, flex: _.videoType == 'live' ? 0 : 1,
child: ClipRect(
child: AppBarAni( child: AppBarAni(
controller: animationController, controller: animationController,
visible: !_.controlsLock.value && _.showControls.value, visible: !_.controlsLock.value && _.showControls.value,
@ -799,7 +797,6 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
), ),
), ),
), ),
),
], ],
), ),
), ),
@ -934,6 +931,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
onSubmittedcb: _handleSubmittedCallback, onSubmittedcb: _handleSubmittedCallback,
), ),
], ],
),
); );
} }
} }

View File

@ -18,19 +18,18 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Padding(
color: Colors.transparent,
height: 90,
padding: const EdgeInsets.symmetric(horizontal: 18), padding: const EdgeInsets.symmetric(horizontal: 18),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.fromLTRB(7, 0, 7, 6), padding: const EdgeInsets.fromLTRB(7, 0, 7, 4),
child: ProgressBarWidget(controller: controller!), child: ProgressBarWidget(controller: controller!),
), ),
Row(children: buildBottomControl!), Row(children: buildBottomControl!),
const SizedBox(height: 10), const SizedBox(height: 6),
], ],
), ),
); );

View File

@ -137,7 +137,8 @@ class SettingBoxKey {
enableGradientBg = 'enableGradientBg', enableGradientBg = 'enableGradientBg',
enableDynamicSwitch = 'enableDynamicSwitch', enableDynamicSwitch = 'enableDynamicSwitch',
navBarSort = 'navBarSort', navBarSort = 'navBarSort',
actionTypeSort = 'actionTypeSort'; actionTypeSort = 'actionTypeSort',
enablePureBlack = 'enablePureBlack';
} }
class LocalCacheKey { class LocalCacheKey {