mod: 侧边栏、动态重构,排行改为首页分区,平板、折叠屏、竖屏视频新适配,播放页可隐藏黑边、截图、点踩,弹幕粗细调整,默认关闭后台播放,弹窗接受返回

This commit is contained in:
orz12
2024-05-20 14:46:31 +08:00
parent fd51cddeca
commit 074bf03946
97 changed files with 4105 additions and 2672 deletions

View File

@@ -6,6 +6,8 @@ import 'package:PiliPalaX/common/skeleton/video_card_h.dart';
import 'package:PiliPalaX/common/widgets/http_error.dart';
import 'package:PiliPalaX/models/common/search_type.dart';
import '../../common/constants.dart';
import '../../utils/grid.dart';
import 'controller.dart';
import 'widgets/article_panel.dart';
import 'widgets/live_panel.dart';
@@ -132,25 +134,34 @@ class _SearchPanelState extends State<SearchPanel>
}
} else {
// 骨架屏
return ListView.builder(
addAutomaticKeepAlives: false,
addRepaintBoundaries: false,
itemCount: 15,
itemBuilder: (context, index) {
switch (widget.searchType) {
case SearchType.video:
return const VideoCardHSkeleton();
case SearchType.media_bangumi:
return const MediaBangumiSkeleton();
case SearchType.bili_user:
return const VideoCardHSkeleton();
case SearchType.live_room:
return const VideoCardHSkeleton();
default:
return const VideoCardHSkeleton();
}
},
);
return CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverGrid(
gridDelegate: SliverGridDelegateWithExtentAndRatio(
mainAxisSpacing: StyleString.safeSpace,
crossAxisSpacing: StyleString.safeSpace,
maxCrossAxisExtent: Grid.maxRowWidth * 2,
childAspectRatio: StyleString.aspectRatio * 2.3,
mainAxisExtent: 0),
delegate: SliverChildBuilderDelegate(
(context, index) {
switch (widget.searchType) {
case SearchType.video:
return const VideoCardHSkeleton();
case SearchType.media_bangumi:
return const MediaBangumiSkeleton();
case SearchType.bili_user:
return const VideoCardHSkeleton();
case SearchType.live_room:
return const VideoCardHSkeleton();
default:
return const VideoCardHSkeleton();
}
},
childCount: 15,
))
]);
}
},
),

View File

@@ -12,14 +12,12 @@ Widget searchArticlePanel(BuildContext context, ctr, list) {
color: Theme.of(context).colorScheme.outline);
return CustomScrollView(controller: ctr.scrollController, slivers: [
SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
mainAxisSpacing: StyleString.cardSpace,
gridDelegate: SliverGridDelegateWithExtentAndRatio(
mainAxisSpacing: StyleString.safeSpace,
crossAxisSpacing: StyleString.safeSpace,
maxCrossAxisExtent: Grid.maxRowWidth * 2,
mainAxisExtent: Grid.calculateActualWidth(
context, Grid.maxRowWidth * 2, StyleString.safeSpace) /
2.1 /
StyleString.aspectRatio),
childAspectRatio: StyleString.aspectRatio * 2.3,
mainAxisExtent: 0),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return InkWell(
@@ -32,8 +30,8 @@ Widget searchArticlePanel(BuildContext context, ctr, list) {
});
},
child: Padding(
padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 5, StyleString.safeSpace, 5),
padding: const EdgeInsets.symmetric(
horizontal: StyleString.safeSpace),
child: LayoutBuilder(builder: (context, boxConstraints) {
final double width = (boxConstraints.maxWidth -
StyleString.cardSpace *

View File

@@ -13,14 +13,12 @@ Widget searchLivePanel(BuildContext context, ctr, list) {
child: GridView.builder(
primary: false,
controller: ctr!.scrollController,
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
gridDelegate: SliverGridDelegateWithExtentAndRatio(
maxCrossAxisExtent: Grid.maxRowWidth,
crossAxisSpacing: StyleString.safeSpace,
mainAxisSpacing: StyleString.safeSpace,
mainAxisExtent: Grid.calculateActualWidth(
context, Grid.maxRowWidth, StyleString.safeSpace) /
StyleString.aspectRatio +
MediaQuery.textScalerOf(context).scale(80),
childAspectRatio: StyleString.aspectRatio,
mainAxisExtent: MediaQuery.textScalerOf(context).scale(80),
),
itemCount: list.length,
itemBuilder: (context, index) {

View File

@@ -19,10 +19,10 @@ Widget searchMbangumiPanel(BuildContext context, ctr, list) {
slivers: [
SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
mainAxisSpacing: StyleString.cardSpace,
mainAxisSpacing: StyleString.safeSpace,
crossAxisSpacing: StyleString.safeSpace,
maxCrossAxisExtent: Grid.maxRowWidth * 2,
mainAxisExtent: 157,
mainAxisExtent: 160,
),
delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
var i = list![index];
@@ -36,8 +36,8 @@ Widget searchMbangumiPanel(BuildContext context, ctr, list) {
// });
},
child: Padding(
padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 7, StyleString.safeSpace, 2),
padding: const EdgeInsets.fromLTRB(StyleString.safeSpace,
StyleString.safeSpace, StyleString.safeSpace, 2),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -125,7 +125,10 @@ Widget searchMbangumiPanel(BuildContext context, ctr, list) {
if (res['status']) {
EpisodeItem episode =
res['data'].episodes.first;
int? epId = res['data'].userStatus?.progress?.lastEpId;
int? epId = res['data']
.userStatus
?.progress
?.lastEpId;
if (epId == null) {
epId = episode.epId;
} else {

View File

@@ -28,7 +28,8 @@ class SearchVideoPanel extends StatelessWidget {
Container(
width: context.width,
height: 34,
padding: const EdgeInsets.only(left: 8, top: 0, right: 12),
padding: const EdgeInsets.only(
left: StyleString.safeSpace, top: 0, right: 12),
child: Row(
children: [
Expanded(
@@ -69,7 +70,7 @@ class SearchVideoPanel extends StatelessWidget {
style: ButtonStyle(
padding: MaterialStateProperty.all(EdgeInsets.zero),
),
onPressed: () => controller.onShowFilterDialog(ctr),
onPressed: () => controller.onShowFilterDialog(context, ctr),
icon: Icon(
Icons.filter_list_outlined,
size: 18,
@@ -84,22 +85,23 @@ class SearchVideoPanel extends StatelessWidget {
child: CustomScrollView(
controller: ctr.scrollController,
slivers: [
SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
mainAxisSpacing: StyleString.cardSpace,
crossAxisSpacing: StyleString.safeSpace,
maxCrossAxisExtent: Grid.maxRowWidth * 2,
mainAxisExtent: Grid.calculateActualWidth(context,
Grid.maxRowWidth * 2, StyleString.safeSpace) /
2.1 /
StyleString.aspectRatio),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return VideoCardH(videoItem: list[index], showPubdate: true);
},
childCount: list.length,
),
),
SliverPadding(
padding: const EdgeInsets.all(StyleString.safeSpace),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithExtentAndRatio(
mainAxisSpacing: StyleString.safeSpace,
crossAxisSpacing: StyleString.safeSpace,
maxCrossAxisExtent: Grid.maxRowWidth * 2,
childAspectRatio: StyleString.aspectRatio * 2.3,
mainAxisExtent: 0),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return VideoCardH(
videoItem: list[index], showPubdate: true);
},
childCount: list.length,
),
)),
],
)),
],
@@ -176,10 +178,10 @@ class VideoPanelController extends GetxController {
super.onInit();
}
onShowFilterDialog(searchPanelCtr) {
SmartDialog.show(
animationType: SmartAnimationType.centerFade_otherSlide,
builder: (BuildContext context) {
onShowFilterDialog(BuildContext context, SearchPanelController searchPanelCtr) {
showDialog(
context: context,
builder: (context) {
TextStyle textStyle = Theme.of(context).textTheme.titleMedium!;
return AlertDialog(
title: const Text('时长筛选'),