mod: lint

mod: tweaks

opt: publish page

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-05-04 11:37:13 +08:00
parent 2cfad80214
commit caa58e9d7d
313 changed files with 2751 additions and 2789 deletions

View File

@@ -29,28 +29,28 @@ class Constants {
static const urlPattern =
r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]';
static get goodsUrlPrefix => "https://gaoneng.bilibili.com/tetris";
static const goodsUrlPrefix = "https://gaoneng.bilibili.com/tetris";
// 超分辨率滤镜
static List<String> get mpvAnime4KShaders => [
'Anime4K_Clamp_Highlights.glsl',
'Anime4K_Restore_CNN_VL.glsl',
'Anime4K_Upscale_CNN_x2_VL.glsl',
'Anime4K_AutoDownscalePre_x2.glsl',
'Anime4K_AutoDownscalePre_x4.glsl',
'Anime4K_Upscale_CNN_x2_M.glsl'
];
static const List<String> mpvAnime4KShaders = [
'Anime4K_Clamp_Highlights.glsl',
'Anime4K_Restore_CNN_VL.glsl',
'Anime4K_Upscale_CNN_x2_VL.glsl',
'Anime4K_AutoDownscalePre_x2.glsl',
'Anime4K_AutoDownscalePre_x4.glsl',
'Anime4K_Upscale_CNN_x2_M.glsl'
];
// 超分辨率滤镜 (轻量)
static List<String> get mpvAnime4KShadersLite => [
'Anime4K_Clamp_Highlights.glsl',
'Anime4K_Restore_CNN_M.glsl',
'Anime4K_Restore_CNN_S.glsl',
'Anime4K_Upscale_CNN_x2_M.glsl',
'Anime4K_AutoDownscalePre_x2.glsl',
'Anime4K_AutoDownscalePre_x4.glsl',
'Anime4K_Upscale_CNN_x2_S.glsl'
];
static const mpvAnime4KShadersLite = [
'Anime4K_Clamp_Highlights.glsl',
'Anime4K_Restore_CNN_M.glsl',
'Anime4K_Restore_CNN_S.glsl',
'Anime4K_Upscale_CNN_x2_M.glsl',
'Anime4K_AutoDownscalePre_x2.glsl',
'Anime4K_AutoDownscalePre_x4.glsl',
'Anime4K_Upscale_CNN_x2_S.glsl'
];
//内容来自 https://passport.bilibili.com/web/generic/country/list
static List<Map<String, dynamic>> get internationalDialingPrefix => [

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class DynamicCardSkeleton extends StatelessWidget {
const DynamicCardSkeleton({super.key});
@@ -28,7 +28,7 @@ class DynamicCardSkeleton extends StatelessWidget {
height: 40,
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(20),
borderRadius: const BorderRadius.all(Radius.circular(20)),
),
),
const SizedBox(width: 10),

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class FavPgcItemSkeleton extends StatelessWidget {
const FavPgcItemSkeleton({super.key});
@@ -25,7 +25,7 @@ class FavPgcItemSkeleton extends StatelessWidget {
return Container(
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(4),
borderRadius: const BorderRadius.all(Radius.circular(4)),
),
width: boxConstraints.maxWidth,
height: boxConstraints.maxHeight,

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:PiliPlus/common/constants.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class MediaBangumiSkeleton extends StatefulWidget {
const MediaBangumiSkeleton({super.key});
@@ -24,8 +24,9 @@ class _MediaBangumiSkeletonState extends State<MediaBangumiSkeleton> {
width: 111,
height: 148,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(6)),
color: bgColor),
borderRadius: const BorderRadius.all(Radius.circular(6)),
color: bgColor,
),
),
const SizedBox(width: 10),
Expanded(

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class MsgFeedSysMsgSkeleton extends StatelessWidget {
const MsgFeedSysMsgSkeleton({super.key});

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class MsgFeedTopSkeleton extends StatelessWidget {
const MsgFeedTopSkeleton({super.key});

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class VideoCardHSkeleton extends StatelessWidget {
const VideoCardHSkeleton({super.key});

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class VideoCardVSkeleton extends StatelessWidget {
const VideoCardVSkeleton({super.key});

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class VideoReplySkeleton extends StatelessWidget {
const VideoReplySkeleton({super.key});

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'skeleton.dart';
import 'package:PiliPlus/common/skeleton/skeleton.dart';
class WhisperItemSkeleton extends StatelessWidget {
const WhisperItemSkeleton({super.key});

View File

@@ -5,7 +5,7 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
class Avatar extends StatelessWidget {
final _BadgeType _badgeType;
@@ -73,10 +73,10 @@ class Avatar extends StatelessWidget {
Get.toNamed('/liveRoom?roomid=$roomId');
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 5, vertical: 1),
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1),
decoration: BoxDecoration(
color: colorScheme.secondaryContainer,
borderRadius: BorderRadius.circular(36),
borderRadius: const BorderRadius.all(Radius.circular(36)),
),
child: Row(
mainAxisSize: MainAxisSize.min,
@@ -106,7 +106,7 @@ class Avatar extends StatelessWidget {
}
Widget _buildAvatar(ColorScheme colorScheme) => size == 80
? Container(
? DecoratedBox(
decoration: BoxDecoration(
border: Border.all(
width: 2,
@@ -114,11 +114,14 @@ class Avatar extends StatelessWidget {
),
shape: BoxShape.circle,
),
child: NetworkImgLayer(
src: avatar,
width: size,
height: size,
type: 'avatar',
child: Padding(
padding: const EdgeInsets.all(2),
child: NetworkImgLayer(
src: avatar,
width: size,
height: size,
type: 'avatar',
),
),
)
: NetworkImgLayer(

View File

@@ -64,12 +64,12 @@ class PBadge extends StatelessWidget {
late EdgeInsets paddingStyle =
const EdgeInsets.symmetric(vertical: 2, horizontal: 3);
double fontSize = 11;
BorderRadius br = BorderRadius.circular(4);
BorderRadius br = const BorderRadius.all(Radius.circular(4));
if (size == 'small') {
paddingStyle = const EdgeInsets.symmetric(vertical: 2, horizontal: 3);
fontSize = 11;
br = BorderRadius.circular(3);
br = const BorderRadius.all(Radius.circular(3));
}
Widget content = Container(

View File

@@ -17,7 +17,7 @@ class CustomToast extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 17, vertical: 10),
decoration: BoxDecoration(
color: theme.colorScheme.primaryContainer.withOpacity(toastOpacity),
borderRadius: BorderRadius.circular(20),
borderRadius: const BorderRadius.all(Radius.circular(20)),
),
child: Text(
msg,
@@ -44,7 +44,7 @@ class LoadingWidget extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20),
decoration: BoxDecoration(
color: theme.dialogBackgroundColor,
borderRadius: BorderRadius.circular(15),
borderRadius: const BorderRadius.all(Radius.circular(15)),
),
child: Column(mainAxisSize: MainAxisSize.min, children: [
//loading animation

View File

@@ -30,7 +30,7 @@ void showConfirmDialog({
Get.back();
onConfirm();
},
child: Text('确认'),
child: const Text('确认'),
),
],
);
@@ -89,10 +89,10 @@ void showPgcFollowDialog({
ListTile(
dense: true,
title: Padding(
padding: EdgeInsets.only(left: 10),
padding: const EdgeInsets.only(left: 10),
child: Text(
'取消$type',
style: TextStyle(fontSize: 14),
style: const TextStyle(fontSize: 14),
),
),
onTap: () {

View File

@@ -7,7 +7,8 @@ import 'package:get/get.dart';
void autoWrapReportDialog(
BuildContext context,
Map<String, Map<int, String>> options,
Future<Map> Function(int, String?, bool) onSuccess,
Future<Map> Function(int reasonType, String? reasonDesc, bool banUid)
onSuccess,
) {
int? reasonType;
String? reasonDesc;
@@ -211,7 +212,7 @@ class _CheckBoxTextState extends State<CheckBoxText> {
class ReportOptions {
// from https://s1.hdslb.com/bfs/seed/jinkela/comment-h5/static/js/605.chunks.js
static Map<String, Map<int, String>> get commentReport => {
static Map<String, Map<int, String>> get commentReport => const {
'违反法律法规': {9: '违法违规', 2: '色情', 10: '低俗', 12: '赌博诈骗', 23: '违法信息外链'},
'谣言类不实信息': {19: '涉政谣言', 22: '虚假不实信息', 20: '涉社会事件谣言'},
'侵犯个人权益': {7: '人身攻击', 15: '侵犯隐私'},
@@ -227,7 +228,7 @@ class ReportOptions {
'其他': {0: '其他'},
};
static Map<String, Map<int, String>> get dynamicReport => {
static Map<String, Map<int, String>> get dynamicReport => const {
'': {
4: '垃圾广告',
8: '引战',

View File

@@ -71,9 +71,9 @@ class RenderMaskedIcon extends RenderProxyBox {
..lineTo(rect.right, rect.bottom - sqrt2Width)
..lineTo(rect.left + sqrt2Width, rect.top));
canvas.save();
canvas.clipPath(path, doAntiAlias: false);
canvas
..save()
..clipPath(path, doAntiAlias: false);
super.paint(context, offset);
context.canvas.restore();

View File

@@ -132,7 +132,7 @@ class _DynamicSliverAppBarState extends State<DynamicSliverAppBar> {
return SliverToBoxAdapter(
child: SizedBox(
key: _childKey,
child: widget.flexibleSpace ?? SizedBox(height: kToolbarHeight),
child: widget.flexibleSpace ?? const SizedBox(height: kToolbarHeight),
),
);
}

View File

@@ -22,7 +22,7 @@ void imageSaveDialog({
margin: const EdgeInsets.symmetric(horizontal: StyleString.safeSpace),
decoration: BoxDecoration(
color: theme.colorScheme.surface,
borderRadius: BorderRadius.circular(10.0),
borderRadius: StyleString.mdRadius,
),
child: Column(
mainAxisSize: MainAxisSize.min,

View File

@@ -61,32 +61,22 @@ Widget imageView(
}
final int row = picArr.length == 4 ? 2 : 3;
return BorderRadius.only(
topLeft: Radius.circular(
(index - row >= 0 ||
((index - 1) >= 0 && (index - 1) % row < index % row))
? 0
: 10,
),
topRight: Radius.circular(
(index - row >= 0 ||
((index + 1) < picArr.length &&
(index + 1) % row > index % row))
? 0
: 10,
),
bottomLeft: Radius.circular(
(index + row < picArr.length ||
((index - 1) >= 0 && (index - 1) % row < index % row))
? 0
: 10,
),
bottomRight: Radius.circular(
(index + row < picArr.length ||
((index + 1) < picArr.length &&
(index + 1) % row > index % row))
? 0
: 10,
),
topLeft: index - row >= 0 ||
((index - 1) >= 0 && (index - 1) % row < index % row)
? Radius.zero
: StyleString.imgRadius,
topRight: index - row >= 0 ||
((index + 1) < picArr.length && (index + 1) % row > index % row)
? Radius.zero
: StyleString.imgRadius,
bottomLeft: index + row < picArr.length ||
((index - 1) >= 0 && (index - 1) % row < index % row)
? Radius.zero
: StyleString.imgRadius,
bottomRight: index + row < picArr.length ||
((index + 1) < picArr.length && (index + 1) % row > index % row)
? Radius.zero
: StyleString.imgRadius,
);
}

View File

@@ -47,9 +47,9 @@ class NetworkImgLayer extends StatelessWidget {
: radius == 0 || type == 'emote'
? _buildImage(context)
: ClipRRect(
borderRadius: BorderRadius.circular(
radius ?? StyleString.imgRadius.x,
),
borderRadius: radius != null
? BorderRadius.circular(radius!)
: StyleString.mdRadius,
child: _buildImage(context),
)
: getPlaceHolder?.call() ?? placeholder(context);
@@ -90,9 +90,9 @@ class NetworkImgLayer extends StatelessWidget {
color: Theme.of(context).colorScheme.onInverseSurface.withOpacity(0.4),
borderRadius: type == 'avatar' || type == 'emote' || radius == 0
? null
: BorderRadius.circular(
radius ?? StyleString.imgRadius.x,
),
: radius != null
? BorderRadius.circular(radius!)
: StyleString.mdRadius,
),
child: type == 'bg'
? const SizedBox.shrink()

View File

@@ -486,7 +486,7 @@ class _ImageUtil {
}
},
);
imageStream = image.image.resolve(const ImageConfiguration());
imageStream = image.image.resolve(ImageConfiguration.empty);
imageStream.addListener(listener);
return completer.future;
}

View File

@@ -771,14 +771,16 @@ class _InteractiveViewerState extends State<InteractiveViewer>
widget.onInteractionStart?.call(details);
if (_controller.isAnimating) {
_controller.stop();
_controller.reset();
_controller
..stop()
..reset();
_animation?.removeListener(_onAnimate);
_animation = null;
}
if (_scaleController.isAnimating) {
_scaleController.stop();
_scaleController.reset();
_scaleController
..stop()
..reset();
_scaleAnimation?.removeListener(_onScaleAnimate);
_scaleAnimation = null;
}

View File

@@ -1,4 +1,5 @@
import 'interactive_viewer.dart' as custom;
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactive_viewer.dart'
as custom;
import 'package:flutter/material.dart';
/// https://github.com/qq326646683/interactiveviewer_gallery

View File

@@ -11,8 +11,9 @@ import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
import 'interactive_viewer_boundary.dart';
import 'interactive_viewer.dart' as custom;
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactive_viewer_boundary.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactive_viewer.dart'
as custom;
/// https://github.com/qq326646683/interactiveviewer_gallery
@@ -136,7 +137,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
}
SystemUiMode? mode;
setStatusBar() async {
Future<void> setStatusBar() async {
if (Platform.isIOS || Platform.isAndroid) {
SystemChrome.setEnabledSystemUIMode(
SystemUiMode.immersiveSticky,
@@ -153,8 +154,9 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
widget.onClose?.call(true);
_player?.dispose();
_pageController?.dispose();
_animationController.removeListener(listener);
_animationController.dispose();
_animationController
..removeListener(listener)
..dispose();
if (widget.setStatusBar != false) {
if (Platform.isIOS || Platform.isAndroid) {
SystemChrome.setEnabledSystemUIMode(
@@ -403,7 +405,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
.toList(),
);
},
child: const Text("保存全部图片"),
child: const Text("保存全部"),
),
if (widget.sources[currentIndex.value].sourceType ==
SourceType.livePhoto)
@@ -470,7 +472,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
);
}
onDoubleTap() {
void onDoubleTap() {
Matrix4 matrix = _transformationController!.value.clone();
double currentScale = matrix.row0.x;
@@ -517,7 +519,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
.whenComplete(() => _onScaleChanged(targetScale));
}
onLongPress() {
void onLongPress() {
showDialog(
context: context,
builder: (context) {

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:flutter/material.dart';
Widget get loadingWidget => Center(child: CircularProgressIndicator());
Widget get loadingWidget => const Center(child: CircularProgressIndicator());
Widget errorWidget({errMsg, onReload}) => HttpError(
isSliver: false,

View File

@@ -320,43 +320,42 @@ class ProgressBar extends LeafRenderObjectWidget {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.add(StringProperty('progress', progress.toString()));
properties.add(StringProperty('total', total.toString()));
properties.add(StringProperty('buffered', buffered.toString()));
properties.add(ObjectFlagProperty<ValueChanged<Duration>>('onSeek', onSeek,
ifNull: 'unimplemented'));
properties.add(ObjectFlagProperty<ThumbDragStartCallback>(
'onDragStart', onDragStart,
ifNull: 'unimplemented'));
properties.add(ObjectFlagProperty<ThumbDragUpdateCallback>(
'onDragUpdate', onDragUpdate,
ifNull: 'unimplemented'));
properties.add(ObjectFlagProperty<VoidCallback>('onDragEnd', onDragEnd,
ifNull: 'unimplemented'));
properties.add(DoubleProperty('barHeight', barHeight));
properties.add(ColorProperty('baseBarColor', baseBarColor));
properties.add(ColorProperty('progressBarColor', progressBarColor));
properties.add(ColorProperty('bufferedBarColor', bufferedBarColor));
properties.add(StringProperty('barCapShape', barCapShape.toString()));
properties.add(DoubleProperty('thumbRadius', thumbRadius));
properties.add(ColorProperty('thumbColor', thumbColor));
properties.add(ColorProperty('thumbGlowColor', thumbGlowColor));
properties.add(DoubleProperty('thumbGlowRadius', thumbGlowRadius));
properties.add(
FlagProperty(
'thumbCanPaintOutsideBar',
value: thumbCanPaintOutsideBar,
ifTrue: 'true',
ifFalse: 'false',
showName: true,
),
);
properties
.add(StringProperty('timeLabelLocation', timeLabelLocation.toString()));
properties.add(StringProperty('timeLabelType', timeLabelType.toString()));
properties
.add(DiagnosticsProperty('timeLabelTextStyle', timeLabelTextStyle));
properties.add(DoubleProperty('timeLabelPadding', timeLabelPadding));
..add(StringProperty('progress', progress.toString()))
..add(StringProperty('total', total.toString()))
..add(StringProperty('buffered', buffered.toString()))
..add(ObjectFlagProperty<ValueChanged<Duration>>('onSeek', onSeek,
ifNull: 'unimplemented'))
..add(ObjectFlagProperty<ThumbDragStartCallback>(
'onDragStart', onDragStart,
ifNull: 'unimplemented'))
..add(ObjectFlagProperty<ThumbDragUpdateCallback>(
'onDragUpdate', onDragUpdate,
ifNull: 'unimplemented'))
..add(ObjectFlagProperty<VoidCallback>('onDragEnd', onDragEnd,
ifNull: 'unimplemented'))
..add(DoubleProperty('barHeight', barHeight))
..add(ColorProperty('baseBarColor', baseBarColor))
..add(ColorProperty('progressBarColor', progressBarColor))
..add(ColorProperty('bufferedBarColor', bufferedBarColor))
..add(StringProperty('barCapShape', barCapShape.toString()))
..add(DoubleProperty('thumbRadius', thumbRadius))
..add(ColorProperty('thumbColor', thumbColor))
..add(ColorProperty('thumbGlowColor', thumbGlowColor))
..add(DoubleProperty('thumbGlowRadius', thumbGlowRadius))
..add(
FlagProperty(
'thumbCanPaintOutsideBar',
value: thumbCanPaintOutsideBar,
ifTrue: 'true',
ifFalse: 'false',
showName: true,
),
)
..add(StringProperty('timeLabelLocation', timeLabelLocation.toString()))
..add(StringProperty('timeLabelType', timeLabelType.toString()))
..add(DiagnosticsProperty('timeLabelTextStyle', timeLabelTextStyle))
..add(DoubleProperty('timeLabelPadding', timeLabelPadding));
}
}
@@ -619,11 +618,10 @@ class _RenderProgressBar extends RenderBox {
TextPainter _layoutText(String text) {
TextPainter textPainter = TextPainter(
text: TextSpan(text: text, style: _timeLabelTextStyle),
textDirection: TextDirection.ltr,
textScaleFactor: textScaleFactor,
);
textPainter.layout(minWidth: 0, maxWidth: double.infinity);
text: TextSpan(text: text, style: _timeLabelTextStyle),
textDirection: TextDirection.ltr,
textScaler: TextScaler.linear(textScaleFactor))
..layout(minWidth: 0, maxWidth: double.infinity);
return textPainter;
}
@@ -919,9 +917,9 @@ class _RenderProgressBar extends RenderBox {
@override
void paint(PaintingContext context, Offset offset) {
final canvas = context.canvas;
canvas.save();
canvas.translate(offset.dx, offset.dy);
final canvas = context.canvas
..save()
..translate(offset.dx, offset.dy);
switch (_timeLabelLocation) {
case TimeLabelLocation.above:
@@ -1013,8 +1011,9 @@ class _RenderProgressBar extends RenderBox {
}
void _drawProgressBar(Canvas canvas, Offset offset, Size localSize) {
canvas.save();
canvas.translate(offset.dx, offset.dy);
canvas
..save()
..translate(offset.dx, offset.dy);
_drawBaseBar(canvas, localSize);
_drawBufferedBar(canvas, localSize);
_drawCurrentProgressBar(canvas, localSize);
@@ -1109,17 +1108,19 @@ class _RenderProgressBar extends RenderBox {
super.describeSemanticsConfiguration(config);
// description
config.textDirection = TextDirection.ltr;
config.label = '进度条'; //'Progress bar';
config.value = '${(_thumbValue * 100).round()}%';
config
..textDirection = TextDirection.ltr
..label = '进度条' //'Progress bar';
..value = '${(_thumbValue * 100).round()}%'
// increase action
config.onIncrease = increaseAction;
// increase action
..onIncrease = increaseAction;
final increased = _thumbValue + _semanticActionUnit;
config.increasedValue = '${((increased).clamp(0.0, 1.0) * 100).round()}%';
config
..increasedValue = '${((increased).clamp(0.0, 1.0) * 100).round()}%'
// decrease action
config.onDecrease = decreaseAction;
// decrease action
..onDecrease = decreaseAction;
final decreased = _thumbValue - _semanticActionUnit;
config.decreasedValue = '${((decreased).clamp(0.0, 1.0) * 100).round()}%';
}

View File

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
Widget videoProgressIndicator(double progress) => ClipRect(
clipper: ProgressClipper(),
child: ClipRRect(
borderRadius: BorderRadius.only(
borderRadius: const BorderRadius.only(
bottomLeft: StyleString.imgRadius,
bottomRight: StyleString.imgRadius,
),

View File

@@ -534,8 +534,7 @@ class RefreshIndicatorState extends State<RefreshIndicator>
_mode = _RefreshIndicatorMode.refresh;
});
final Future<void> refreshResult = widget.onRefresh();
refreshResult.whenComplete(() {
widget.onRefresh().whenComplete(() {
if (mounted && _mode == _RefreshIndicatorMode.refresh) {
completer.complete();
_dismiss(_RefreshIndicatorMode.done);

View File

@@ -32,7 +32,7 @@ class VideoCardHGrpc extends StatelessWidget {
String type = 'video';
final String heroTag = Utils.makeHeroTag(aid);
return InkWell(
borderRadius: BorderRadius.circular(12),
borderRadius: const BorderRadius.all(Radius.circular(12)),
onLongPress: () => imageSaveDialog(
title: videoItem.smallCoverV5.base.title,
cover: videoItem.smallCoverV5.base.cover,

View File

@@ -86,14 +86,14 @@ class VideoCardHMemberVideo extends StatelessWidget {
height: maxHeight,
),
if (fromViewAid == videoItem.param)
Positioned.fill(
const Positioned.fill(
child: DecoratedBox(
decoration: BoxDecoration(
borderRadius: StyleString.mdRadius,
color: Colors.black54,
),
child: Center(
child: const Text(
child: Text(
'上次观看',
style: TextStyle(
color: Colors.white,

View File

@@ -31,7 +31,7 @@ class VideoCardV extends StatelessWidget {
return numericRegex.hasMatch(str);
}
void onPushDetail(heroTag) async {
Future<void> onPushDetail(heroTag) async {
String? goto = videoItem.goto;
switch (goto) {
case 'bangumi':

View File

@@ -19,7 +19,7 @@ class VideoCardVMemberHome extends StatelessWidget {
required this.videoItem,
});
void onPushDetail(heroTag) async {
Future<void> onPushDetail(heroTag) async {
String? goto = videoItem.goto;
switch (goto) {
case 'bangumi':

View File

@@ -116,7 +116,7 @@ class VideoCustomActions {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (tp.dislikeReasons != null) ...[
Text('我不想看'),
const Text('我不想看'),
const SizedBox(height: 5),
Wrap(
spacing: 8.0,
@@ -128,7 +128,7 @@ class VideoCustomActions {
],
if (tp.feedbacks != null) ...[
const SizedBox(height: 5),
Text('反馈'),
const Text('反馈'),
const SizedBox(height: 5),
Wrap(
spacing: 8.0,
@@ -153,10 +153,7 @@ class VideoCustomActions {
Get.back();
},
style: FilledButton.styleFrom(
visualDensity: VisualDensity(
horizontal: -2,
vertical: -2,
),
visualDensity: VisualDensity.compact,
),
child: const Text("撤销"),
),
@@ -197,10 +194,7 @@ class VideoCustomActions {
}
},
style: FilledButton.styleFrom(
visualDensity: VisualDensity(
horizontal: -2,
vertical: -2,
),
visualDensity: VisualDensity.compact,
),
child: const Text("点踩"),
),
@@ -216,10 +210,7 @@ class VideoCustomActions {
res['status'] ? "取消踩" : res['msg']);
},
style: FilledButton.styleFrom(
visualDensity: VisualDensity(
horizontal: -2,
vertical: -2,
),
visualDensity: VisualDensity.compact,
),
child: const Text("撤销"),
),
@@ -288,7 +279,7 @@ class VideoCustomActions {
class VideoPopupMenu extends StatelessWidget {
final double? size;
final double? iconSize;
final double menuItemHeight = 45;
final double menuItemHeight;
final dynamic videoItem;
final VoidCallback? onRemove;
@@ -298,6 +289,7 @@ class VideoPopupMenu extends StatelessWidget {
required this.iconSize,
required this.videoItem,
this.onRemove,
this.menuItemHeight = 45,
});
@override

View File

@@ -319,7 +319,7 @@ class GrpcRepo {
required String content,
MsgType msgType = MsgType.EN_MSG_TYPE_TEXT,
}) async {
final devId = Uuid().v4();
final devId = const Uuid().v4();
return await _request(
GrpcUrl.sendMsg,
ReqSendMsg(

View File

@@ -1,4 +1,4 @@
import 'constants.dart';
import 'package:PiliPlus/http/constants.dart';
class Api {
// 推荐视频

View File

@@ -63,7 +63,7 @@ class DanmakuHttp {
int? pool, // 弹幕池选择0普通池 1字幕池 2特殊池代码/BAS弹幕默认普通池0
//int? rnd,// 当前时间戳*1000000若无此项则发送弹幕冷却时间限制为90s若有此项则发送弹幕冷却时间限制为5s
bool? colorful, //60001专属渐变彩色需要会员
int? checkbox_type, //是否带 UP 身份标识0普通4带有标识
int? checkboxType, //是否带 UP 身份标识0普通4带有标识
// String? csrf,//CSRF Token位于 Cookie Cookie 方式必要
// String? access_key,// APP 登录 Token APP 方式必要
}) async {
@@ -84,7 +84,7 @@ class DanmakuHttp {
'pool': pool,
'rnd': DateTime.now().microsecondsSinceEpoch,
'colorful': colorful == true ? 60001 : null,
'checkbox_type': checkbox_type,
'checkbox_type': checkboxType,
'csrf': Accounts.main.csrf,
// 'access_key': access_key,
}..removeWhere((key, value) => value == null);

View File

@@ -128,9 +128,10 @@ class Request {
..autoUncompress = false; // Http2Adapter没有自动解压, 统一行为
// 设置代理
if (enableSystemProxy) {
client.findProxy = (_) => 'PROXY $systemProxyHost:$systemProxyPort';
client.badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
client
..findProxy = ((_) => 'PROXY $systemProxyHost:$systemProxyPort')
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
return client;
});

View File

@@ -86,10 +86,10 @@ class LoginHttp {
required String cid,
required String tel,
// String? deviceTouristId,
String? gee_challenge,
String? gee_seccode,
String? gee_validate,
String? recaptcha_token,
String? geeChallenge,
String? geeSeccode,
String? geeValidate,
String? recaptchaToken,
}) async {
int timestamp = DateTime.now().millisecondsSinceEpoch;
var data = {
@@ -100,16 +100,16 @@ class LoginHttp {
'cid': cid,
// if (deviceTouristId != null) 'device_tourist_id': deviceTouristId,
'disable_rcmd': '0',
if (gee_challenge != null) 'gee_challenge': gee_challenge,
if (gee_seccode != null) 'gee_seccode': gee_seccode,
if (gee_validate != null) 'gee_validate': gee_validate,
if (geeChallenge != null) 'gee_challenge': geeChallenge,
if (geeSeccode != null) 'gee_seccode': geeSeccode,
if (geeValidate != null) 'gee_validate': geeValidate,
'local_id': buvid,
// https://chinggg.github.io/post/appre/
'login_session_id':
md5.convert(utf8.encode(buvid + timestamp.toString())).toString(),
'mobi_app': 'android_hd',
'platform': 'android',
if (recaptcha_token != null) 'recaptcha_token': recaptcha_token,
if (recaptchaToken != null) 'recaptcha_token': recaptchaToken,
's_locale': 'zh_CN',
'statistics': Constants.statistics,
'tel': tel,
@@ -183,10 +183,10 @@ class LoginHttp {
required String password,
required String key,
required String salt,
String? gee_challenge,
String? gee_seccode,
String? gee_validate,
String? recaptcha_token,
String? geeChallenge,
String? geeSeccode,
String? geeValidate,
String? recaptchaToken,
}) async {
dynamic publicKey = RSAKeyParser().parse(key);
String passwordEncrypted =
@@ -209,15 +209,15 @@ class LoginHttp {
.base64),
'from_pv': 'main.homepage.avatar-nologin.all.click',
'from_url': Uri.encodeComponent('bilibili://pegasus/promo'),
if (gee_challenge != null) 'gee_challenge': gee_challenge,
if (gee_seccode != null) 'gee_seccode': gee_seccode,
if (gee_validate != null) 'gee_validate': gee_validate,
if (geeChallenge != null) 'gee_challenge': geeChallenge,
if (geeSeccode != null) 'gee_seccode': geeSeccode,
if (geeValidate != null) 'gee_validate': geeValidate,
'local_id': buvid, //LoginUtils.generateBuvid(),
'mobi_app': 'android_hd',
'password': passwordEncrypted,
'permission': 'ALL',
'platform': 'android',
if (recaptcha_token != null) 'recaptcha_token': recaptcha_token,
if (recaptchaToken != null) 'recaptcha_token': recaptchaToken,
's_locale': 'zh_CN',
'statistics': Constants.statistics,
'ts': (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(),

View File

@@ -564,6 +564,6 @@ class MsgHttp {
}
static String getDevId() {
return Uuid().v4();
return const Uuid().v4();
}
}

View File

@@ -23,8 +23,9 @@ class RetryInterceptor extends Interceptor {
}
(options..path = redirectUrl).maxRedirects--;
if (status == 303) {
options.data = null;
options.method = 'GET';
options
..data = null
..method = 'GET';
}
Request.dio
.fetch(options)

View File

@@ -605,7 +605,7 @@ class UserHttp {
}
}
static videoTags({required String bvid}) async {
static Future<Map<String, dynamic>> videoTags({required String bvid}) async {
var res =
await Request().get(Api.videoTags, queryParameters: {'bvid': bvid});
if (res.data['code'] == 0) {

View File

@@ -950,11 +950,11 @@ class VideoHttp {
}
String processList(List list) {
final sb = StringBuffer('WEBVTT\n\n');
sb.writeAll(
list.map((item) =>
'${item?['sid'] ?? 0}\n${subtitleTimecode(item['from'])} --> ${subtitleTimecode(item['to'])}\n${item['content'].trim()}'),
'\n\n');
final sb = StringBuffer('WEBVTT\n\n')
..writeAll(
list.map((item) =>
'${item?['sid'] ?? 0}\n${subtitleTimecode(item['from'])} --> ${subtitleTimecode(item['to'])}\n${item['content'].trim()}'),
'\n\n');
return sb.toString();
}

View File

@@ -25,7 +25,7 @@ import 'package:PiliPlus/utils/storage.dart';
import 'package:media_kit/media_kit.dart'; // Provides [Player], [Media], [Playlist] etc.
import 'package:PiliPlus/utils/recommend_filter.dart';
import 'package:catcher_2/catcher_2.dart';
import './services/loggeer.dart';
import 'package:PiliPlus/services/loggeer.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
@@ -67,7 +67,7 @@ void main() async {
await Request.setCookie();
RecommendFilter();
// 异常捕获 logo记录
final String buildConfig = '''\n
const String buildConfig = '''\n
Build Time: ${BuildConfig.buildTime}
Commit Hash: ${BuildConfig.commitHash}''';
final Catcher2Options debugConfig = Catcher2Options(

View File

@@ -1,4 +1,4 @@
import 'pgc_rank_item_model.dart';
import 'package:PiliPlus/models/bangumi/pgc_rank/pgc_rank_item_model.dart';
class Data {
List<PgcRankItemModel>? list;

View File

@@ -1,7 +1,7 @@
import 'badge_info.dart';
import 'icon_font.dart';
import 'new_ep.dart';
import 'stat.dart';
import 'package:PiliPlus/models/bangumi/pgc_rank/badge_info.dart';
import 'package:PiliPlus/models/bangumi/pgc_rank/icon_font.dart';
import 'package:PiliPlus/models/bangumi/pgc_rank/new_ep.dart';
import 'package:PiliPlus/models/bangumi/pgc_rank/stat.dart';
class PgcRankItemModel {
String? badge;

View File

@@ -1,4 +1,4 @@
import 'icon_font.dart';
import 'package:PiliPlus/models/bangumi/pgc_timeline/icon_font.dart';
class Episode {
String? cover;

View File

@@ -1,4 +1,4 @@
import 'result.dart';
import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart';
class PgcTimeline {
int? code;

View File

@@ -1,4 +1,4 @@
import 'episode.dart';
import 'package:PiliPlus/models/bangumi/pgc_timeline/episode.dart';
class Result {
String? date;

View File

@@ -1,8 +1,9 @@
enum AudioNormalization { disable, dynaudnorm, loudnorm, custom }
extension AudioNormalizationExt on AudioNormalization {
String get title => ['禁用', '预设 dynaudnorm', '预设 loudnorm', '自定义参数'][index];
String get param => [
String get title =>
const ['禁用', '预设 dynaudnorm', '预设 loudnorm', '自定义参数'][index];
String get param => const [
'',
// ref https://github.com/KRTirtho/spotube/commit/da10ab2e291d4ba4d3082b9a6ae535639fb8f1b7
'dynaudnorm=g=5:f=250:r=0.9:p=0.5',

View File

@@ -15,9 +15,9 @@ enum BusinessType {
extension BusinessTypeExtension on BusinessType {
String get type =>
['archive', 'pgc', 'live', 'article-list', 'article'][index];
const ['archive', 'pgc', 'live', 'article-list', 'article'][index];
// 隐藏时长
List get hiddenDurationType => ['live', 'article-list', 'article'];
List get hiddenDurationType => const ['live', 'article-list', 'article'];
// 右上
List get showBadge => ['pgc', 'article-list', 'article'];
List get showBadge => const ['pgc', 'article-list', 'article'];
}

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
final List<Map<String, dynamic>> colorThemeTypes = [
{'color': const Color(0xFF5CB67B), 'label': '默认绿'},
{'color': const Color(0xFFFF7299), 'label': '粉红色'},
const List<Map<String, dynamic>> colorThemeTypes = [
{'color': Color(0xFF5CB67B), 'label': '默认绿'},
{'color': Color(0xFFFF7299), 'label': '粉红色'},
{'color': Colors.red, 'label': '红色'},
{'color': Colors.orange, 'label': '橙色'},
{'color': Colors.amber, 'label': '琥珀色'},

View File

@@ -1,11 +1,11 @@
enum DynamicBadgeMode { hidden, point, number }
extension DynamicBadgeModeDesc on DynamicBadgeMode {
String get description => ['隐藏', '红点', '数字'][index];
String get description => const ['隐藏', '红点', '数字'][index];
}
enum MsgUnReadType { pm, reply, at, like, sysMsg }
extension MsgUnReadTypeExt on MsgUnReadType {
String get title => ['私信', '回复我的', '@我', '收到的赞', '系统通知'][index];
String get title => const ['私信', '回复我的', '@我', '收到的赞', '系统通知'][index];
}

View File

@@ -7,39 +7,39 @@ enum DynamicsType {
}
extension BusinessTypeExtension on DynamicsType {
String get values => ['all', 'video', 'pgc', 'article', 'up'][index];
String get labels => ['全部', '投稿', '番剧', '专栏', 'UP'][index];
String get values => const ['all', 'video', 'pgc', 'article', 'up'][index];
String get labels => const ['全部', '投稿', '番剧', '专栏', 'UP'][index];
}
List get tabsConfig => [
{
'tag': 'all',
'value': DynamicsType.all,
'label': '全部',
'enabled': true,
},
{
'tag': 'video',
'value': DynamicsType.video,
'label': '投稿',
'enabled': true,
},
{
'tag': 'pgc',
'value': DynamicsType.pgc,
'label': '番剧',
'enabled': true,
},
{
'tag': 'article',
'value': DynamicsType.article,
'label': '专栏',
'enabled': true,
},
{
'tag': 'up',
'value': DynamicsType.up,
'label': 'UP',
'enabled': true,
},
];
const List tabsConfig = [
{
'tag': 'all',
'value': DynamicsType.all,
'label': '全部',
'enabled': true,
},
{
'tag': 'video',
'value': DynamicsType.video,
'label': '投稿',
'enabled': true,
},
{
'tag': 'pgc',
'value': DynamicsType.pgc,
'label': '番剧',
'enabled': true,
},
{
'tag': 'article',
'value': DynamicsType.article,
'label': '专栏',
'enabled': true,
},
{
'tag': 'up',
'value': DynamicsType.up,
'label': 'UP',
'enabled': true,
},
];

View File

@@ -1,43 +1,43 @@
import 'package:flutter/material.dart';
List get defaultNavigationBars => [
{
'id': 0,
'icon': const Icon(
Icons.home_outlined,
size: 23,
),
'selectIcon': const Icon(
Icons.home,
size: 23,
),
'label': "首页",
'count': 0,
},
{
'id': 1,
'icon': const Icon(
Icons.motion_photos_on_outlined,
size: 21,
),
'selectIcon': const Icon(
Icons.motion_photos_on,
size: 21,
),
'label': "动态",
'count': 0,
},
{
'id': 2,
'icon': const Icon(
Icons.video_collection_outlined,
size: 21,
),
'selectIcon': const Icon(
Icons.video_collection,
size: 21,
),
'label': "媒体库",
'count': 0,
}
];
List defaultNavigationBars = [
{
'id': 0,
'icon': const Icon(
Icons.home_outlined,
size: 23,
),
'selectIcon': const Icon(
Icons.home,
size: 23,
),
'label': "首页",
'count': 0,
},
{
'id': 1,
'icon': const Icon(
Icons.motion_photos_on_outlined,
size: 21,
),
'selectIcon': const Icon(
Icons.motion_photos_on,
size: 21,
),
'label': "动态",
'count': 0,
},
{
'id': 2,
'icon': const Icon(
Icons.video_collection_outlined,
size: 21,
),
'selectIcon': const Icon(
Icons.video_collection,
size: 21,
),
'label': "媒体库",
'count': 0,
}
];

View File

@@ -1,6 +1,6 @@
enum ReplySortType { time, like }
extension ReplySortTypeExtension on ReplySortType {
String get title => ['最新评论', '最热评论'][index];
String get label => ['最新', '最热'][index];
String get title => const ['最新评论', '最热评论'][index];
String get label => const ['最新', '最热'][index];
}

View File

@@ -24,7 +24,7 @@ enum SearchType {
}
extension SearchTypeExtension on SearchType {
String get label => [
String get label => const [
// '综合',
'视频',
'番剧',
@@ -49,5 +49,5 @@ enum ArchiveFilterType {
extension ArchiveFilterTypeExtension on ArchiveFilterType {
String get description =>
['默认排序', '播放多', '新发布', '弹幕多', '收藏多', '评论多', '最多喜欢'][index];
const ['默认排序', '播放多', '新发布', '弹幕多', '收藏多', '评论多', '最多喜欢'][index];
}

View File

@@ -1,5 +1,5 @@
enum ActionType { skip, mute, full, poi }
extension ActionTypeExt on ActionType {
String get title => ['跳过', '静音', '整个视频', '精彩时刻'][index];
String get title => const ['跳过', '静音', '整个视频', '精彩时刻'][index];
}

View File

@@ -47,45 +47,9 @@ enum SegmentType {
// };
// }
List<ActionType> segmentType2ActionType(SegmentType segmentType) {
return switch (segmentType) {
SegmentType.sponsor => [ActionType.skip, ActionType.mute, ActionType.full],
SegmentType.selfpromo => [
ActionType.skip,
ActionType.mute,
ActionType.full
],
SegmentType.interaction => [
ActionType.skip,
ActionType.mute,
],
SegmentType.intro => [
ActionType.skip,
ActionType.mute,
],
SegmentType.outro => [
ActionType.skip,
ActionType.mute,
],
SegmentType.preview => [
ActionType.skip,
ActionType.mute,
],
SegmentType.music_offtopic => [
ActionType.skip,
],
SegmentType.poi_highlight => [ActionType.poi],
SegmentType.filler => [
ActionType.skip,
ActionType.mute,
],
SegmentType.exclusive_access => [ActionType.full],
};
}
extension SegmentTypeExt on SegmentType {
/// from https://github.com/hanydd/BilibiliSponsorBlock/blob/master/public/_locales/zh_CN/messages.json
String get title => [
String get title => const [
'赞助广告', //sponsor
'无偿/自我推广', //selfpromo
'三连/订阅提醒', //interaction
@@ -98,7 +62,7 @@ extension SegmentTypeExt on SegmentType {
'柔性推广/品牌合作', //exclusive_access
][index];
String get shortTitle => [
String get shortTitle => const [
'赞助广告', //sponsor
'推广', //selfpromo
'订阅提醒', //interaction
@@ -111,7 +75,7 @@ extension SegmentTypeExt on SegmentType {
'品牌合作', //exclusive_access
][index];
String get description => [
String get description => const [
'付费推广、付费推荐和直接广告。不是自我推广或免费提及他们喜欢的商品/创作者/网站/产品。', //sponsor
'类似于 “赞助广告” ,但无报酬或是自我推广。包括有关商品、捐赠的部分或合作者的信息。', //selfpromo
'视频中间简短提醒观众来一键三连或关注。 如果片段较长,或是有具体内容,则应分类为自我推广。', //interaction
@@ -124,7 +88,7 @@ extension SegmentTypeExt on SegmentType {
'仅用于对整个视频进行标记。适用于展示UP主免费或获得补贴后使用的产品、服务或场地的视频。', //exclusive_access
][index];
Color get color => [
Color get color => const [
Color(0xFF00d400), //sponsor
Color(0xFFffff00), //selfpromo
Color(0xFFcc00ff), //interaction
@@ -136,4 +100,44 @@ extension SegmentTypeExt on SegmentType {
Color(0xFF7300FF), //filler
Color(0xFF008a5c), //exclusive_access
][index];
List<ActionType> get toActionType {
return switch (this) {
SegmentType.sponsor => const [
ActionType.skip,
ActionType.mute,
ActionType.full
],
SegmentType.selfpromo => const [
ActionType.skip,
ActionType.mute,
ActionType.full
],
SegmentType.interaction => const [
ActionType.skip,
ActionType.mute,
],
SegmentType.intro => const [
ActionType.skip,
ActionType.mute,
],
SegmentType.outro => const [
ActionType.skip,
ActionType.mute,
],
SegmentType.preview => const [
ActionType.skip,
ActionType.mute,
],
SegmentType.music_offtopic => const [
ActionType.skip,
],
SegmentType.poi_highlight => const [ActionType.poi],
SegmentType.filler => const [
ActionType.skip,
ActionType.mute,
],
SegmentType.exclusive_access => const [ActionType.full],
};
}
}

View File

@@ -1,5 +1,5 @@
enum SkipType { alwaysSkip, skipOnce, skipManually, showOnly, disable }
extension SkipTypeExt on SkipType {
String get title => ['总是跳过', '跳过一次', '手动跳过', '仅显示', '禁用'][index];
String get title => const ['总是跳过', '跳过一次', '手动跳过', '仅显示', '禁用'][index];
}

View File

@@ -1,5 +1,5 @@
enum SuperResolutionType { disable, efficiency, quality }
extension SuperResolutionTypeExt on SuperResolutionType {
String get title => ['禁用', '效率', '画质'][index];
String get title => const ['禁用', '效率', '画质'][index];
}

View File

@@ -15,7 +15,7 @@ import 'package:material_design_icons_flutter/material_design_icons_flutter.dart
enum TabType { live, rcmd, hot, rank, bangumi, cinema }
extension TabTypeDesc on TabType {
String get description => ['直播', '推荐', '热门', '分区', '番剧', '影视'][index];
String get description => const ['直播', '推荐', '热门', '分区', '番剧', '影视'][index];
}
List get tabsConfig => [

View File

@@ -8,7 +8,7 @@ enum ThemeType {
}
extension ThemeTypeExt on ThemeType {
String get description => ['浅色', '深色', '跟随系统'][index];
String get description => const ['浅色', '深色', '跟随系统'][index];
int get code => index;

View File

@@ -6,5 +6,5 @@ enum UpPanelPosition {
}
extension UpPanelPositionDesc on UpPanelPosition {
String get labels => ['左侧常驻', '右侧常驻', '左侧抽屉', '右侧抽屉'][index];
String get labels => const ['左侧常驻', '右侧常驻', '左侧抽屉', '右侧抽屉'][index];
}

View File

@@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:PiliPlus/common/widgets/avatar.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'article_content_model.dart';
import 'package:PiliPlus/models/dynamics/article_content_model.dart';
class DynamicsDataModel {
bool? hasMore;

View File

@@ -1,4 +1,4 @@
import 'datum.dart';
import 'package:PiliPlus/models/live/live_emoticons/datum.dart';
class LiveEmoteData {
int? fansBrand;

View File

@@ -1,6 +1,6 @@
import 'emoticon.dart';
import 'top_show.dart';
import 'top_show_recent.dart';
import 'package:PiliPlus/models/live/live_emoticons/emoticon.dart';
import 'package:PiliPlus/models/live/live_emoticons/top_show.dart';
import 'package:PiliPlus/models/live/live_emoticons/top_show_recent.dart';
class LiveEmoteDatum {
List<LiveEmoticon>? emoticons;

View File

@@ -1,4 +1,4 @@
import 'data.dart';
import 'package:PiliPlus/models/live/live_emoticons/data.dart';
class LiveEmoticons {
int? code;

View File

@@ -1,5 +1,5 @@
import 'top_left.dart';
import 'top_right.dart';
import 'package:PiliPlus/models/live/live_emoticons/top_left.dart';
import 'package:PiliPlus/models/live/live_emoticons/top_right.dart';
class TopShow {
TopLeft? topLeft;

View File

@@ -1,5 +1,5 @@
import 'top_left.dart';
import 'top_right.dart';
import 'package:PiliPlus/models/live/live_emoticons/top_left.dart';
import 'package:PiliPlus/models/live/live_emoticons/top_right.dart';
class TopShowRecent {
TopLeft? topLeft;

View File

@@ -9,7 +9,7 @@ enum LiveQuality {
}
extension LiveQualityCode on LiveQuality {
static final List<int> _codeList = [
static const List<int> _codeList = [
30000,
20000,
10000,
@@ -27,17 +27,14 @@ extension LiveQualityCode on LiveQuality {
}
return null;
}
}
extension VideoQualityDesc on LiveQuality {
static final List<String> _descList = [
'杜比',
'4K',
'原画',
'蓝光',
'',
'高清',
'流畅',
];
String get description => _descList[index];
String get description => const [
'杜比',
'4K',
'原画',
'蓝光',
'超清',
'',
'流畅',
][index];
}

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/utils/utils.dart';
import '../model_video.dart';
import 'package:PiliPlus/models/model_video.dart';
class MemberArchiveDataModel {
MemberArchiveDataModel({

View File

@@ -1,4 +1,4 @@
import '../model_hot_video_item.dart';
import 'package:PiliPlus/models/model_hot_video_item.dart';
class MemberCoinsDataModel extends HotVideoItemModel {
String? subtitle;

View File

@@ -1,8 +1,8 @@
import 'package:PiliPlus/pages/common/multi_select_controller.dart'
show MultiSelectData;
import 'model_owner.dart';
import 'model_rec_video_item.dart';
import 'model_video.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models/model_rec_video_item.dart';
import 'package:PiliPlus/models/model_video.dart';
// 稍后再看, 排行榜等网页返回也使用该类
class HotVideoItemModel extends BaseRecVideoItemModel with MultiSelectData {

View File

@@ -1,6 +1,6 @@
import 'package:hive/hive.dart';
import 'model_video.dart';
import 'package:PiliPlus/models/model_video.dart';
part 'model_owner.g.dart';

View File

@@ -1,5 +1,5 @@
import './model_owner.dart';
import 'model_video.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models/model_video.dart';
abstract class BaseRecVideoItemModel extends BaseVideoItemModel {
String? goto;

View File

@@ -1,8 +1,8 @@
import 'package:PiliPlus/utils/em.dart';
import 'package:PiliPlus/utils/utils.dart';
import '../model_owner.dart';
import '../model_video.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models/model_video.dart';
abstract class SearchNumData<T> {
SearchNumData({

View File

@@ -1,8 +1,8 @@
import 'package:json_annotation/json_annotation.dart';
import 'episodic_button.dart';
import 'item.dart';
import 'order.dart';
import 'package:PiliPlus/models/space/episodic_button.dart';
import 'package:PiliPlus/models/space/item.dart';
import 'package:PiliPlus/models/space/order.dart';
part 'archive.g.dart';

View File

@@ -1,7 +1,7 @@
import 'package:json_annotation/json_annotation.dart';
import 'container_size.dart';
import 'fallback_layers.dart';
import 'package:PiliPlus/models/space/container_size.dart';
import 'package:PiliPlus/models/space/fallback_layers.dart';
part 'avatar.g.dart';

View File

@@ -2,19 +2,19 @@ import 'package:PiliPlus/models/space/pr_info.dart';
import 'package:PiliPlus/models/space/space_tag_bottom.dart';
import 'package:json_annotation/json_annotation.dart';
import 'achieve.dart';
import 'avatar.dart';
import 'entrance.dart';
import 'honours.dart';
import 'level_info.dart';
import 'likes.dart';
import 'nameplate.dart';
import 'nft_certificate.dart';
import 'official_verify.dart';
import 'pendant.dart';
import 'profession_verify.dart';
import 'relation.dart';
import 'vip.dart';
import 'package:PiliPlus/models/space/achieve.dart';
import 'package:PiliPlus/models/space/avatar.dart';
import 'package:PiliPlus/models/space/entrance.dart';
import 'package:PiliPlus/models/space/honours.dart';
import 'package:PiliPlus/models/space/level_info.dart';
import 'package:PiliPlus/models/space/likes.dart';
import 'package:PiliPlus/models/space/nameplate.dart';
import 'package:PiliPlus/models/space/nft_certificate.dart';
import 'package:PiliPlus/models/space/official_verify.dart';
import 'package:PiliPlus/models/space/pendant.dart';
import 'package:PiliPlus/models/space/profession_verify.dart';
import 'package:PiliPlus/models/space/relation.dart';
import 'package:PiliPlus/models/space/vip.dart';
part 'card.g.dart';

View File

@@ -1,7 +1,7 @@
import 'package:json_annotation/json_annotation.dart';
import 'day.dart';
import 'night.dart';
import 'package:PiliPlus/models/space/day.dart';
import 'package:PiliPlus/models/space/night.dart';
part 'color_config.g.dart';

View File

@@ -1,19 +1,19 @@
import 'package:PiliPlus/models/space_article/data.dart';
import 'package:json_annotation/json_annotation.dart';
import 'archive.dart';
import 'attention_tip.dart';
import 'audios.dart';
import 'card.dart';
import 'coin_archive.dart';
import 'favourite2.dart';
import 'images.dart';
import 'like_archive.dart';
import 'season.dart';
import 'series.dart';
import 'setting.dart';
import 'tab.dart';
import 'tab2.dart';
import 'package:PiliPlus/models/space/archive.dart';
import 'package:PiliPlus/models/space/attention_tip.dart';
import 'package:PiliPlus/models/space/audios.dart';
import 'package:PiliPlus/models/space/card.dart';
import 'package:PiliPlus/models/space/coin_archive.dart';
import 'package:PiliPlus/models/space/favourite2.dart';
import 'package:PiliPlus/models/space/images.dart';
import 'package:PiliPlus/models/space/like_archive.dart';
import 'package:PiliPlus/models/space/season.dart';
import 'package:PiliPlus/models/space/series.dart';
import 'package:PiliPlus/models/space/setting.dart';
import 'package:PiliPlus/models/space/tab.dart';
import 'package:PiliPlus/models/space/tab2.dart';
part 'data.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'color_config.dart';
import 'package:PiliPlus/models/space/color_config.dart';
part 'draw.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'draw.dart';
import 'package:PiliPlus/models/space/draw.dart';
part 'draw_src.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'layer.dart';
import 'package:PiliPlus/models/space/layer.dart';
part 'fallback_layers.g.dart';

View File

@@ -1,8 +1,8 @@
import 'package:json_annotation/json_annotation.dart';
import 'pos_spec.dart';
import 'render_spec.dart';
import 'size_spec.dart';
import 'package:PiliPlus/models/space/pos_spec.dart';
import 'package:PiliPlus/models/space/render_spec.dart';
import 'package:PiliPlus/models/space/size_spec.dart';
part 'general_spec.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'colour.dart';
import 'package:PiliPlus/models/space/colour.dart';
part 'honours.g.dart';

View File

@@ -1,8 +1,8 @@
import 'package:json_annotation/json_annotation.dart';
import 'digital_info.dart';
import 'entrance_button.dart';
import 'purchase_button.dart';
import 'package:PiliPlus/models/space/digital_info.dart';
import 'package:PiliPlus/models/space/entrance_button.dart';
import 'package:PiliPlus/models/space/purchase_button.dart';
part 'images.g.dart';

View File

@@ -1,8 +1,8 @@
import 'package:json_annotation/json_annotation.dart';
import 'general_spec.dart';
import 'layer_config.dart';
import 'resource.dart';
import 'package:PiliPlus/models/space/general_spec.dart';
import 'package:PiliPlus/models/space/layer_config.dart';
import 'package:PiliPlus/models/space/resource.dart';
part 'layer.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'senior_inquiry.dart';
import 'package:PiliPlus/models/space/senior_inquiry.dart';
part 'level_info.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'draw_src.dart';
import 'package:PiliPlus/models/space/draw_src.dart';
part 'res_native_draw.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'res_native_draw.dart';
import 'package:PiliPlus/models/space/res_native_draw.dart';
part 'resource.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'data.dart';
import 'package:PiliPlus/models/space/data.dart';
part 'space.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'item.dart';
import 'package:PiliPlus/models/space/item.dart';
part 'tab2.g.dart';

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'label.dart';
import 'package:PiliPlus/models/space/label.dart';
part 'vip.g.dart';

View File

@@ -1,9 +1,9 @@
import 'package:json_annotation/json_annotation.dart';
import 'episodic_button.dart';
import 'item.dart';
import 'last_watched_locator.dart';
import 'order.dart';
import 'package:PiliPlus/models/space_archive/episodic_button.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/models/space_archive/last_watched_locator.dart';
import 'package:PiliPlus/models/space_archive/order.dart';
part 'data.g.dart';

View File

@@ -1,8 +1,8 @@
import '../model_owner.dart';
import '../model_video.dart';
import 'badge.dart';
import 'cursor_attr.dart';
import 'three_point.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models/model_video.dart';
import 'package:PiliPlus/models/space_archive/badge.dart';
import 'package:PiliPlus/models/space_archive/cursor_attr.dart';
import 'package:PiliPlus/models/space_archive/three_point.dart';
class SpaceArchiveItem extends BaseSimpleVideoItemModel {
String? subtitle;

View File

@@ -1,6 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'data.dart';
import 'package:PiliPlus/models/space_archive/data.dart';
part 'space_archive.g.dart';

View File

@@ -1,8 +1,8 @@
import '../model_owner.dart';
import 'nameplate.dart';
import 'official_verify.dart';
import 'pendant.dart';
import 'vip.dart';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models/space_article/nameplate.dart';
import 'package:PiliPlus/models/space_article/official_verify.dart';
import 'package:PiliPlus/models/space_article/pendant.dart';
import 'package:PiliPlus/models/space_article/vip.dart';
class Author extends Owner {
Pendant? pendant;

View File

@@ -1,7 +1,7 @@
import 'package:json_annotation/json_annotation.dart';
import 'item.dart';
import 'list.dart';
import 'package:PiliPlus/models/space_article/item.dart';
import 'package:PiliPlus/models/space_article/list.dart';
part 'data.g.dart';

View File

@@ -1,9 +1,9 @@
import 'package:PiliPlus/models/dynamics/article_content_model.dart';
import 'author.dart';
import 'category.dart';
import 'media.dart';
import 'stats.dart';
import 'package:PiliPlus/models/space_article/author.dart';
import 'package:PiliPlus/models/space_article/category.dart';
import 'package:PiliPlus/models/space_article/media.dart';
import 'package:PiliPlus/models/space_article/stats.dart';
class SpaceArticleItem {
int? id;

Some files were not shown because too many files have changed in this diff Show More