diff --git a/.vscode/settings.json b/.vscode/settings.json index b05eba9d..1a5e4d29 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,8 @@ "editor.formatOnSave": true, "[dart]": { "editor.formatOnType": true - } + }, + // "editor.codeActionsOnSave": { + // "source.fixAll": true, + // } } \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index 61b6c4de..dcc4a95b 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -21,9 +21,37 @@ linter: # or a specific dart file by using the `// ignore: name_of_lint` and # `// ignore_for_file: name_of_lint` syntax on the line or in the file # producing the lint. + # https://dart.dev/tools/linter-rules rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - + # - always_specify_types + # - avoid_positional_boolean_parameters + # - use_null_aware_elements + - always_declare_return_types + - always_use_package_imports + - avoid_empty_else + - avoid_field_initializers_in_const_classes + - avoid_print + - avoid_relative_lib_imports + - avoid_shadowing_type_parameters + - avoid_single_cascade_in_expression_statements + - avoid_slow_async_io + - avoid_type_to_string + - avoid_types_as_parameter_names + - avoid_unnecessary_containers + - avoid_void_async + - await_only_futures + - camel_case_extensions + - camel_case_types + - cancel_subscriptions + - cascade_invocations + - prefer_const_constructors + - prefer_const_declarations + - sized_box_for_whitespace + - unnecessary_late + - use_colored_box + - use_decorated_box + - use_named_constants # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/lib/common/constants.dart b/lib/common/constants.dart index a17917cf..1af6bcff 100644 --- a/lib/common/constants.dart +++ b/lib/common/constants.dart @@ -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 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 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 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> get internationalDialingPrefix => [ diff --git a/lib/common/skeleton/dynamic_card.dart b/lib/common/skeleton/dynamic_card.dart index 1d94e91b..1124c4d8 100644 --- a/lib/common/skeleton/dynamic_card.dart +++ b/lib/common/skeleton/dynamic_card.dart @@ -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), diff --git a/lib/common/skeleton/fav_pgc_item.dart b/lib/common/skeleton/fav_pgc_item.dart index 7f7b1096..0b01a8bb 100644 --- a/lib/common/skeleton/fav_pgc_item.dart +++ b/lib/common/skeleton/fav_pgc_item.dart @@ -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, diff --git a/lib/common/skeleton/media_bangumi.dart b/lib/common/skeleton/media_bangumi.dart index e43f0faa..5fba101d 100644 --- a/lib/common/skeleton/media_bangumi.dart +++ b/lib/common/skeleton/media_bangumi.dart @@ -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 { 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( diff --git a/lib/common/skeleton/msg_feed_sys_msg_.dart b/lib/common/skeleton/msg_feed_sys_msg_.dart index ed0a8b0f..cc414385 100644 --- a/lib/common/skeleton/msg_feed_sys_msg_.dart +++ b/lib/common/skeleton/msg_feed_sys_msg_.dart @@ -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}); diff --git a/lib/common/skeleton/msg_feed_top.dart b/lib/common/skeleton/msg_feed_top.dart index 45b0dcee..2e48b0ee 100644 --- a/lib/common/skeleton/msg_feed_top.dart +++ b/lib/common/skeleton/msg_feed_top.dart @@ -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}); diff --git a/lib/common/skeleton/video_card_h.dart b/lib/common/skeleton/video_card_h.dart index 2d5b2571..a03f43f7 100644 --- a/lib/common/skeleton/video_card_h.dart +++ b/lib/common/skeleton/video_card_h.dart @@ -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}); diff --git a/lib/common/skeleton/video_card_v.dart b/lib/common/skeleton/video_card_v.dart index a7a7c7f1..490c3ded 100644 --- a/lib/common/skeleton/video_card_v.dart +++ b/lib/common/skeleton/video_card_v.dart @@ -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}); diff --git a/lib/common/skeleton/video_reply.dart b/lib/common/skeleton/video_reply.dart index 9c7e15c6..4d02cfbf 100644 --- a/lib/common/skeleton/video_reply.dart +++ b/lib/common/skeleton/video_reply.dart @@ -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}); diff --git a/lib/common/skeleton/whisper_item.dart b/lib/common/skeleton/whisper_item.dart index da596b8c..7893a01b 100644 --- a/lib/common/skeleton/whisper_item.dart +++ b/lib/common/skeleton/whisper_item.dart @@ -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}); diff --git a/lib/common/widgets/avatar.dart b/lib/common/widgets/avatar.dart index 35d24fb9..0b0a117d 100644 --- a/lib/common/widgets/avatar.dart +++ b/lib/common/widgets/avatar.dart @@ -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( diff --git a/lib/common/widgets/badge.dart b/lib/common/widgets/badge.dart index 1ca2d260..d291adf3 100644 --- a/lib/common/widgets/badge.dart +++ b/lib/common/widgets/badge.dart @@ -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( diff --git a/lib/common/widgets/custom_toast.dart b/lib/common/widgets/custom_toast.dart index 9b99a9c2..8b0f856a 100644 --- a/lib/common/widgets/custom_toast.dart +++ b/lib/common/widgets/custom_toast.dart @@ -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 diff --git a/lib/common/widgets/dialog/dialog.dart b/lib/common/widgets/dialog/dialog.dart index fff355de..db280510 100644 --- a/lib/common/widgets/dialog/dialog.dart +++ b/lib/common/widgets/dialog/dialog.dart @@ -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: () { diff --git a/lib/common/widgets/dialog/report.dart b/lib/common/widgets/dialog/report.dart index a81789a0..1286b076 100644 --- a/lib/common/widgets/dialog/report.dart +++ b/lib/common/widgets/dialog/report.dart @@ -7,7 +7,8 @@ import 'package:get/get.dart'; void autoWrapReportDialog( BuildContext context, Map> options, - Future Function(int, String?, bool) onSuccess, + Future Function(int reasonType, String? reasonDesc, bool banUid) + onSuccess, ) { int? reasonType; String? reasonDesc; @@ -211,7 +212,7 @@ class _CheckBoxTextState extends State { class ReportOptions { // from https://s1.hdslb.com/bfs/seed/jinkela/comment-h5/static/js/605.chunks.js - static Map> get commentReport => { + static Map> get commentReport => const { '违反法律法规': {9: '违法违规', 2: '色情', 10: '低俗', 12: '赌博诈骗', 23: '违法信息外链'}, '谣言类不实信息': {19: '涉政谣言', 22: '虚假不实信息', 20: '涉社会事件谣言'}, '侵犯个人权益': {7: '人身攻击', 15: '侵犯隐私'}, @@ -227,7 +228,7 @@ class ReportOptions { '其他': {0: '其他'}, }; - static Map> get dynamicReport => { + static Map> get dynamicReport => const { '': { 4: '垃圾广告', 8: '引战', diff --git a/lib/common/widgets/disabled_icon.dart b/lib/common/widgets/disabled_icon.dart index 61b65b3f..b9991c7a 100644 --- a/lib/common/widgets/disabled_icon.dart +++ b/lib/common/widgets/disabled_icon.dart @@ -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(); diff --git a/lib/common/widgets/dynamic_sliver_appbar.dart b/lib/common/widgets/dynamic_sliver_appbar.dart index db81e22a..99e78286 100644 --- a/lib/common/widgets/dynamic_sliver_appbar.dart +++ b/lib/common/widgets/dynamic_sliver_appbar.dart @@ -132,7 +132,7 @@ class _DynamicSliverAppBarState extends State { return SliverToBoxAdapter( child: SizedBox( key: _childKey, - child: widget.flexibleSpace ?? SizedBox(height: kToolbarHeight), + child: widget.flexibleSpace ?? const SizedBox(height: kToolbarHeight), ), ); } diff --git a/lib/common/widgets/image/image_save.dart b/lib/common/widgets/image/image_save.dart index 10d0ef0e..364c4bba 100644 --- a/lib/common/widgets/image/image_save.dart +++ b/lib/common/widgets/image/image_save.dart @@ -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, diff --git a/lib/common/widgets/image/image_view.dart b/lib/common/widgets/image/image_view.dart index fa0a503f..def5a61f 100644 --- a/lib/common/widgets/image/image_view.dart +++ b/lib/common/widgets/image/image_view.dart @@ -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, ); } diff --git a/lib/common/widgets/image/network_img_layer.dart b/lib/common/widgets/image/network_img_layer.dart index f63227d3..cd9abfac 100644 --- a/lib/common/widgets/image/network_img_layer.dart +++ b/lib/common/widgets/image/network_img_layer.dart @@ -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() diff --git a/lib/common/widgets/image/nine_grid_view.dart b/lib/common/widgets/image/nine_grid_view.dart index a1567513..14fb3f3a 100644 --- a/lib/common/widgets/image/nine_grid_view.dart +++ b/lib/common/widgets/image/nine_grid_view.dart @@ -486,7 +486,7 @@ class _ImageUtil { } }, ); - imageStream = image.image.resolve(const ImageConfiguration()); + imageStream = image.image.resolve(ImageConfiguration.empty); imageStream.addListener(listener); return completer.future; } diff --git a/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart b/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart index 98f5ad76..bfaa7519 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart @@ -771,14 +771,16 @@ class _InteractiveViewerState extends State 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; } diff --git a/lib/common/widgets/interactiveviewer_gallery/interactive_viewer_boundary.dart b/lib/common/widgets/interactiveviewer_gallery/interactive_viewer_boundary.dart index 512af5d7..17dbe874 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactive_viewer_boundary.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactive_viewer_boundary.dart @@ -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 diff --git a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart index 5a53e1ff..432e840d 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart @@ -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 } SystemUiMode? mode; - setStatusBar() async { + Future setStatusBar() async { if (Platform.isIOS || Platform.isAndroid) { SystemChrome.setEnabledSystemUIMode( SystemUiMode.immersiveSticky, @@ -153,8 +154,9 @@ class _InteractiveviewerGalleryState extends State 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 .toList(), ); }, - child: const Text("保存全部图片"), + child: const Text("保存全部"), ), if (widget.sources[currentIndex.value].sourceType == SourceType.livePhoto) @@ -470,7 +472,7 @@ class _InteractiveviewerGalleryState extends State ); } - onDoubleTap() { + void onDoubleTap() { Matrix4 matrix = _transformationController!.value.clone(); double currentScale = matrix.row0.x; @@ -517,7 +519,7 @@ class _InteractiveviewerGalleryState extends State .whenComplete(() => _onScaleChanged(targetScale)); } - onLongPress() { + void onLongPress() { showDialog( context: context, builder: (context) { diff --git a/lib/common/widgets/loading_widget/loading_widget.dart b/lib/common/widgets/loading_widget/loading_widget.dart index d4ff4ab8..a3a6823f 100644 --- a/lib/common/widgets/loading_widget/loading_widget.dart +++ b/lib/common/widgets/loading_widget/loading_widget.dart @@ -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, diff --git a/lib/common/widgets/progress_bar/audio_video_progress_bar.dart b/lib/common/widgets/progress_bar/audio_video_progress_bar.dart index 9bd66e5a..93ce37ff 100644 --- a/lib/common/widgets/progress_bar/audio_video_progress_bar.dart +++ b/lib/common/widgets/progress_bar/audio_video_progress_bar.dart @@ -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>('onSeek', onSeek, - ifNull: 'unimplemented')); - properties.add(ObjectFlagProperty( - 'onDragStart', onDragStart, - ifNull: 'unimplemented')); - properties.add(ObjectFlagProperty( - 'onDragUpdate', onDragUpdate, - ifNull: 'unimplemented')); - properties.add(ObjectFlagProperty('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>('onSeek', onSeek, + ifNull: 'unimplemented')) + ..add(ObjectFlagProperty( + 'onDragStart', onDragStart, + ifNull: 'unimplemented')) + ..add(ObjectFlagProperty( + 'onDragUpdate', onDragUpdate, + ifNull: 'unimplemented')) + ..add(ObjectFlagProperty('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()}%'; } diff --git a/lib/common/widgets/progress_bar/video_progress_indicator.dart b/lib/common/widgets/progress_bar/video_progress_indicator.dart index 4fe85200..4910b6c6 100644 --- a/lib/common/widgets/progress_bar/video_progress_indicator.dart +++ b/lib/common/widgets/progress_bar/video_progress_indicator.dart @@ -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, ), diff --git a/lib/common/widgets/refresh_indicator.dart b/lib/common/widgets/refresh_indicator.dart index a1f80422..e3f13a7e 100644 --- a/lib/common/widgets/refresh_indicator.dart +++ b/lib/common/widgets/refresh_indicator.dart @@ -534,8 +534,7 @@ class RefreshIndicatorState extends State _mode = _RefreshIndicatorMode.refresh; }); - final Future refreshResult = widget.onRefresh(); - refreshResult.whenComplete(() { + widget.onRefresh().whenComplete(() { if (mounted && _mode == _RefreshIndicatorMode.refresh) { completer.complete(); _dismiss(_RefreshIndicatorMode.done); diff --git a/lib/common/widgets/video_card/video_card_h_grpc.dart b/lib/common/widgets/video_card/video_card_h_grpc.dart index 75691b36..6ac43850 100644 --- a/lib/common/widgets/video_card/video_card_h_grpc.dart +++ b/lib/common/widgets/video_card/video_card_h_grpc.dart @@ -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, diff --git a/lib/common/widgets/video_card/video_card_h_member_video.dart b/lib/common/widgets/video_card/video_card_h_member_video.dart index dba452f8..94b93435 100644 --- a/lib/common/widgets/video_card/video_card_h_member_video.dart +++ b/lib/common/widgets/video_card/video_card_h_member_video.dart @@ -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, diff --git a/lib/common/widgets/video_card/video_card_v.dart b/lib/common/widgets/video_card/video_card_v.dart index 9430acaf..bf49edba 100644 --- a/lib/common/widgets/video_card/video_card_v.dart +++ b/lib/common/widgets/video_card/video_card_v.dart @@ -31,7 +31,7 @@ class VideoCardV extends StatelessWidget { return numericRegex.hasMatch(str); } - void onPushDetail(heroTag) async { + Future onPushDetail(heroTag) async { String? goto = videoItem.goto; switch (goto) { case 'bangumi': diff --git a/lib/common/widgets/video_card/video_card_v_member_home.dart b/lib/common/widgets/video_card/video_card_v_member_home.dart index 58b31bf9..c3d9efb8 100644 --- a/lib/common/widgets/video_card/video_card_v_member_home.dart +++ b/lib/common/widgets/video_card/video_card_v_member_home.dart @@ -19,7 +19,7 @@ class VideoCardVMemberHome extends StatelessWidget { required this.videoItem, }); - void onPushDetail(heroTag) async { + Future onPushDetail(heroTag) async { String? goto = videoItem.goto; switch (goto) { case 'bangumi': diff --git a/lib/common/widgets/video_popup_menu.dart b/lib/common/widgets/video_popup_menu.dart index 067e7adb..aa4736a4 100644 --- a/lib/common/widgets/video_popup_menu.dart +++ b/lib/common/widgets/video_popup_menu.dart @@ -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 diff --git a/lib/grpc/grpc_repo.dart b/lib/grpc/grpc_repo.dart index 20db782a..24241143 100644 --- a/lib/grpc/grpc_repo.dart +++ b/lib/grpc/grpc_repo.dart @@ -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( diff --git a/lib/http/api.dart b/lib/http/api.dart index 947c02e2..b546fdf0 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -1,4 +1,4 @@ -import 'constants.dart'; +import 'package:PiliPlus/http/constants.dart'; class Api { // 推荐视频 diff --git a/lib/http/danmaku.dart b/lib/http/danmaku.dart index da3f09bd..8f095c33 100644 --- a/lib/http/danmaku.dart +++ b/lib/http/danmaku.dart @@ -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); diff --git a/lib/http/init.dart b/lib/http/init.dart index cf60335f..51c93fb7 100644 --- a/lib/http/init.dart +++ b/lib/http/init.dart @@ -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; }); diff --git a/lib/http/login.dart b/lib/http/login.dart index d31a5be7..2e1a1c38 100644 --- a/lib/http/login.dart +++ b/lib/http/login.dart @@ -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(), diff --git a/lib/http/msg.dart b/lib/http/msg.dart index 685a7191..7a7988ab 100644 --- a/lib/http/msg.dart +++ b/lib/http/msg.dart @@ -564,6 +564,6 @@ class MsgHttp { } static String getDevId() { - return Uuid().v4(); + return const Uuid().v4(); } } diff --git a/lib/http/retry_interceptor.dart b/lib/http/retry_interceptor.dart index 4b1daa39..7ff72826 100644 --- a/lib/http/retry_interceptor.dart +++ b/lib/http/retry_interceptor.dart @@ -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) diff --git a/lib/http/user.dart b/lib/http/user.dart index 85a4b6b2..c9bb6a3b 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -605,7 +605,7 @@ class UserHttp { } } - static videoTags({required String bvid}) async { + static Future> videoTags({required String bvid}) async { var res = await Request().get(Api.videoTags, queryParameters: {'bvid': bvid}); if (res.data['code'] == 0) { diff --git a/lib/http/video.dart b/lib/http/video.dart index 7a26719f..bf0b53e6 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -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(); } diff --git a/lib/main.dart b/lib/main.dart index b5d49b47..415f7b64 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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( diff --git a/lib/models/bangumi/pgc_rank/data.dart b/lib/models/bangumi/pgc_rank/data.dart index 9d7a0ef1..2b61e6a5 100644 --- a/lib/models/bangumi/pgc_rank/data.dart +++ b/lib/models/bangumi/pgc_rank/data.dart @@ -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? list; diff --git a/lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart b/lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart index 88b364d7..938a3880 100644 --- a/lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart +++ b/lib/models/bangumi/pgc_rank/pgc_rank_item_model.dart @@ -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; diff --git a/lib/models/bangumi/pgc_timeline/episode.dart b/lib/models/bangumi/pgc_timeline/episode.dart index c955fac5..7d4a405e 100644 --- a/lib/models/bangumi/pgc_timeline/episode.dart +++ b/lib/models/bangumi/pgc_timeline/episode.dart @@ -1,4 +1,4 @@ -import 'icon_font.dart'; +import 'package:PiliPlus/models/bangumi/pgc_timeline/icon_font.dart'; class Episode { String? cover; diff --git a/lib/models/bangumi/pgc_timeline/pgc_timeline.dart b/lib/models/bangumi/pgc_timeline/pgc_timeline.dart index 9173cd80..7772da82 100644 --- a/lib/models/bangumi/pgc_timeline/pgc_timeline.dart +++ b/lib/models/bangumi/pgc_timeline/pgc_timeline.dart @@ -1,4 +1,4 @@ -import 'result.dart'; +import 'package:PiliPlus/models/bangumi/pgc_timeline/result.dart'; class PgcTimeline { int? code; diff --git a/lib/models/bangumi/pgc_timeline/result.dart b/lib/models/bangumi/pgc_timeline/result.dart index fa7d8a81..76e0314e 100644 --- a/lib/models/bangumi/pgc_timeline/result.dart +++ b/lib/models/bangumi/pgc_timeline/result.dart @@ -1,4 +1,4 @@ -import 'episode.dart'; +import 'package:PiliPlus/models/bangumi/pgc_timeline/episode.dart'; class Result { String? date; diff --git a/lib/models/common/audio_normalization.dart b/lib/models/common/audio_normalization.dart index c1936ac8..4fb635df 100644 --- a/lib/models/common/audio_normalization.dart +++ b/lib/models/common/audio_normalization.dart @@ -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', diff --git a/lib/models/common/business_type.dart b/lib/models/common/business_type.dart index ed15a268..01740cf7 100644 --- a/lib/models/common/business_type.dart +++ b/lib/models/common/business_type.dart @@ -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']; } diff --git a/lib/models/common/color_type.dart b/lib/models/common/color_type.dart index 6e858d7e..4ac54779 100644 --- a/lib/models/common/color_type.dart +++ b/lib/models/common/color_type.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -final List> colorThemeTypes = [ - {'color': const Color(0xFF5CB67B), 'label': '默认绿'}, - {'color': const Color(0xFFFF7299), 'label': '粉红色'}, +const List> colorThemeTypes = [ + {'color': Color(0xFF5CB67B), 'label': '默认绿'}, + {'color': Color(0xFFFF7299), 'label': '粉红色'}, {'color': Colors.red, 'label': '红色'}, {'color': Colors.orange, 'label': '橙色'}, {'color': Colors.amber, 'label': '琥珀色'}, diff --git a/lib/models/common/dynamic_badge_mode.dart b/lib/models/common/dynamic_badge_mode.dart index 01e4c7d1..80d83d98 100644 --- a/lib/models/common/dynamic_badge_mode.dart +++ b/lib/models/common/dynamic_badge_mode.dart @@ -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]; } diff --git a/lib/models/common/dynamics_type.dart b/lib/models/common/dynamics_type.dart index 0de2c003..4732c270 100644 --- a/lib/models/common/dynamics_type.dart +++ b/lib/models/common/dynamics_type.dart @@ -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, + }, +]; diff --git a/lib/models/common/nav_bar_config.dart b/lib/models/common/nav_bar_config.dart index 73b1c20f..988b02ce 100644 --- a/lib/models/common/nav_bar_config.dart +++ b/lib/models/common/nav_bar_config.dart @@ -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, + } +]; diff --git a/lib/models/common/reply_sort_type.dart b/lib/models/common/reply_sort_type.dart index f85b6088..4bb20333 100644 --- a/lib/models/common/reply_sort_type.dart +++ b/lib/models/common/reply_sort_type.dart @@ -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]; } diff --git a/lib/models/common/search_type.dart b/lib/models/common/search_type.dart index 13cfa21c..5e1b4b22 100644 --- a/lib/models/common/search_type.dart +++ b/lib/models/common/search_type.dart @@ -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]; } diff --git a/lib/models/common/sponsor_block/action_type.dart b/lib/models/common/sponsor_block/action_type.dart index 0d275b9c..57740afe 100644 --- a/lib/models/common/sponsor_block/action_type.dart +++ b/lib/models/common/sponsor_block/action_type.dart @@ -1,5 +1,5 @@ enum ActionType { skip, mute, full, poi } extension ActionTypeExt on ActionType { - String get title => ['跳过', '静音', '整个视频', '精彩时刻'][index]; + String get title => const ['跳过', '静音', '整个视频', '精彩时刻'][index]; } diff --git a/lib/models/common/sponsor_block/segment_type.dart b/lib/models/common/sponsor_block/segment_type.dart index 36218d6b..bf675666 100644 --- a/lib/models/common/sponsor_block/segment_type.dart +++ b/lib/models/common/sponsor_block/segment_type.dart @@ -47,45 +47,9 @@ enum SegmentType { // }; // } -List 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 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], + }; + } } diff --git a/lib/models/common/sponsor_block/skip_type.dart b/lib/models/common/sponsor_block/skip_type.dart index 52c65708..6c4cd398 100644 --- a/lib/models/common/sponsor_block/skip_type.dart +++ b/lib/models/common/sponsor_block/skip_type.dart @@ -1,5 +1,5 @@ enum SkipType { alwaysSkip, skipOnce, skipManually, showOnly, disable } extension SkipTypeExt on SkipType { - String get title => ['总是跳过', '跳过一次', '手动跳过', '仅显示', '禁用'][index]; + String get title => const ['总是跳过', '跳过一次', '手动跳过', '仅显示', '禁用'][index]; } diff --git a/lib/models/common/super_resolution_type.dart b/lib/models/common/super_resolution_type.dart index c11b9275..5106c52c 100644 --- a/lib/models/common/super_resolution_type.dart +++ b/lib/models/common/super_resolution_type.dart @@ -1,5 +1,5 @@ enum SuperResolutionType { disable, efficiency, quality } extension SuperResolutionTypeExt on SuperResolutionType { - String get title => ['禁用', '效率', '画质'][index]; + String get title => const ['禁用', '效率', '画质'][index]; } diff --git a/lib/models/common/tab_type.dart b/lib/models/common/tab_type.dart index c4d9cbe4..2fe80835 100644 --- a/lib/models/common/tab_type.dart +++ b/lib/models/common/tab_type.dart @@ -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 => [ diff --git a/lib/models/common/theme_type.dart b/lib/models/common/theme_type.dart index 6ec0ad84..7f4341e2 100644 --- a/lib/models/common/theme_type.dart +++ b/lib/models/common/theme_type.dart @@ -8,7 +8,7 @@ enum ThemeType { } extension ThemeTypeExt on ThemeType { - String get description => ['浅色', '深色', '跟随系统'][index]; + String get description => const ['浅色', '深色', '跟随系统'][index]; int get code => index; diff --git a/lib/models/common/up_panel_position.dart b/lib/models/common/up_panel_position.dart index 658d3643..f42cda38 100644 --- a/lib/models/common/up_panel_position.dart +++ b/lib/models/common/up_panel_position.dart @@ -6,5 +6,5 @@ enum UpPanelPosition { } extension UpPanelPositionDesc on UpPanelPosition { - String get labels => ['左侧常驻', '右侧常驻', '左侧抽屉', '右侧抽屉'][index]; + String get labels => const ['左侧常驻', '右侧常驻', '左侧抽屉', '右侧抽屉'][index]; } diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 39c586ce..02e972f0 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -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; diff --git a/lib/models/live/live_emoticons/data.dart b/lib/models/live/live_emoticons/data.dart index 644b432a..ad6e64e7 100644 --- a/lib/models/live/live_emoticons/data.dart +++ b/lib/models/live/live_emoticons/data.dart @@ -1,4 +1,4 @@ -import 'datum.dart'; +import 'package:PiliPlus/models/live/live_emoticons/datum.dart'; class LiveEmoteData { int? fansBrand; diff --git a/lib/models/live/live_emoticons/datum.dart b/lib/models/live/live_emoticons/datum.dart index 2215701e..f72dc86d 100644 --- a/lib/models/live/live_emoticons/datum.dart +++ b/lib/models/live/live_emoticons/datum.dart @@ -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? emoticons; diff --git a/lib/models/live/live_emoticons/live_emoticons.dart b/lib/models/live/live_emoticons/live_emoticons.dart index 15f2d22d..de0ab1d0 100644 --- a/lib/models/live/live_emoticons/live_emoticons.dart +++ b/lib/models/live/live_emoticons/live_emoticons.dart @@ -1,4 +1,4 @@ -import 'data.dart'; +import 'package:PiliPlus/models/live/live_emoticons/data.dart'; class LiveEmoticons { int? code; diff --git a/lib/models/live/live_emoticons/top_show.dart b/lib/models/live/live_emoticons/top_show.dart index ce4700a7..1cf6ad43 100644 --- a/lib/models/live/live_emoticons/top_show.dart +++ b/lib/models/live/live_emoticons/top_show.dart @@ -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; diff --git a/lib/models/live/live_emoticons/top_show_recent.dart b/lib/models/live/live_emoticons/top_show_recent.dart index 9b3b9a06..09869c33 100644 --- a/lib/models/live/live_emoticons/top_show_recent.dart +++ b/lib/models/live/live_emoticons/top_show_recent.dart @@ -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; diff --git a/lib/models/live/quality.dart b/lib/models/live/quality.dart index 07706857..2ea3e434 100644 --- a/lib/models/live/quality.dart +++ b/lib/models/live/quality.dart @@ -9,7 +9,7 @@ enum LiveQuality { } extension LiveQualityCode on LiveQuality { - static final List _codeList = [ + static const List _codeList = [ 30000, 20000, 10000, @@ -27,17 +27,14 @@ extension LiveQualityCode on LiveQuality { } return null; } -} -extension VideoQualityDesc on LiveQuality { - static final List _descList = [ - '杜比', - '4K', - '原画', - '蓝光', - '超清', - '高清', - '流畅', - ]; - String get description => _descList[index]; + String get description => const [ + '杜比', + '4K', + '原画', + '蓝光', + '超清', + '高清', + '流畅', + ][index]; } diff --git a/lib/models/member/archive.dart b/lib/models/member/archive.dart index 54599909..23a7a8bd 100644 --- a/lib/models/member/archive.dart +++ b/lib/models/member/archive.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/utils/utils.dart'; -import '../model_video.dart'; +import 'package:PiliPlus/models/model_video.dart'; class MemberArchiveDataModel { MemberArchiveDataModel({ diff --git a/lib/models/member/coin.dart b/lib/models/member/coin.dart index 4b5d9f53..d60dca07 100644 --- a/lib/models/member/coin.dart +++ b/lib/models/member/coin.dart @@ -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; diff --git a/lib/models/model_hot_video_item.dart b/lib/models/model_hot_video_item.dart index 30894db6..12d65e88 100644 --- a/lib/models/model_hot_video_item.dart +++ b/lib/models/model_hot_video_item.dart @@ -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 { diff --git a/lib/models/model_owner.dart b/lib/models/model_owner.dart index ef19c39d..ac0ce5e9 100644 --- a/lib/models/model_owner.dart +++ b/lib/models/model_owner.dart @@ -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'; diff --git a/lib/models/model_rec_video_item.dart b/lib/models/model_rec_video_item.dart index d39f919e..2cced42b 100644 --- a/lib/models/model_rec_video_item.dart +++ b/lib/models/model_rec_video_item.dart @@ -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; diff --git a/lib/models/search/result.dart b/lib/models/search/result.dart index d89c2910..3b21d195 100644 --- a/lib/models/search/result.dart +++ b/lib/models/search/result.dart @@ -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 { SearchNumData({ diff --git a/lib/models/space/archive.dart b/lib/models/space/archive.dart index caecb55a..a2de6eae 100644 --- a/lib/models/space/archive.dart +++ b/lib/models/space/archive.dart @@ -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'; diff --git a/lib/models/space/avatar.dart b/lib/models/space/avatar.dart index 6594b88b..526375f7 100644 --- a/lib/models/space/avatar.dart +++ b/lib/models/space/avatar.dart @@ -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'; diff --git a/lib/models/space/card.dart b/lib/models/space/card.dart index af9e1756..e35daa4a 100644 --- a/lib/models/space/card.dart +++ b/lib/models/space/card.dart @@ -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'; diff --git a/lib/models/space/color_config.dart b/lib/models/space/color_config.dart index fa6d255d..2bd9883c 100644 --- a/lib/models/space/color_config.dart +++ b/lib/models/space/color_config.dart @@ -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'; diff --git a/lib/models/space/data.dart b/lib/models/space/data.dart index e951aea7..f0166722 100644 --- a/lib/models/space/data.dart +++ b/lib/models/space/data.dart @@ -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'; diff --git a/lib/models/space/draw.dart b/lib/models/space/draw.dart index 2802aa9e..d68fa6a9 100644 --- a/lib/models/space/draw.dart +++ b/lib/models/space/draw.dart @@ -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'; diff --git a/lib/models/space/draw_src.dart b/lib/models/space/draw_src.dart index d66dc02a..01d88383 100644 --- a/lib/models/space/draw_src.dart +++ b/lib/models/space/draw_src.dart @@ -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'; diff --git a/lib/models/space/fallback_layers.dart b/lib/models/space/fallback_layers.dart index 2f224195..f525b1ee 100644 --- a/lib/models/space/fallback_layers.dart +++ b/lib/models/space/fallback_layers.dart @@ -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'; diff --git a/lib/models/space/general_spec.dart b/lib/models/space/general_spec.dart index 4b3429f2..081f6972 100644 --- a/lib/models/space/general_spec.dart +++ b/lib/models/space/general_spec.dart @@ -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'; diff --git a/lib/models/space/honours.dart b/lib/models/space/honours.dart index 79623875..482ccecf 100644 --- a/lib/models/space/honours.dart +++ b/lib/models/space/honours.dart @@ -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'; diff --git a/lib/models/space/images.dart b/lib/models/space/images.dart index ecd49395..07e599e4 100644 --- a/lib/models/space/images.dart +++ b/lib/models/space/images.dart @@ -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'; diff --git a/lib/models/space/layer.dart b/lib/models/space/layer.dart index 91180f4b..0ec99e52 100644 --- a/lib/models/space/layer.dart +++ b/lib/models/space/layer.dart @@ -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'; diff --git a/lib/models/space/level_info.dart b/lib/models/space/level_info.dart index f71c1d6b..40bfda80 100644 --- a/lib/models/space/level_info.dart +++ b/lib/models/space/level_info.dart @@ -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'; diff --git a/lib/models/space/res_native_draw.dart b/lib/models/space/res_native_draw.dart index 5c82e113..cc7f4b63 100644 --- a/lib/models/space/res_native_draw.dart +++ b/lib/models/space/res_native_draw.dart @@ -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'; diff --git a/lib/models/space/resource.dart b/lib/models/space/resource.dart index 2deb74ea..fceb95bf 100644 --- a/lib/models/space/resource.dart +++ b/lib/models/space/resource.dart @@ -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'; diff --git a/lib/models/space/space.dart b/lib/models/space/space.dart index 5452e76f..fad05d50 100644 --- a/lib/models/space/space.dart +++ b/lib/models/space/space.dart @@ -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'; diff --git a/lib/models/space/tab2.dart b/lib/models/space/tab2.dart index f7c6321a..37c772fc 100644 --- a/lib/models/space/tab2.dart +++ b/lib/models/space/tab2.dart @@ -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'; diff --git a/lib/models/space/vip.dart b/lib/models/space/vip.dart index 280bd4d7..45f69f48 100644 --- a/lib/models/space/vip.dart +++ b/lib/models/space/vip.dart @@ -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'; diff --git a/lib/models/space_archive/data.dart b/lib/models/space_archive/data.dart index da98a0ae..b2baf9dd 100644 --- a/lib/models/space_archive/data.dart +++ b/lib/models/space_archive/data.dart @@ -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'; diff --git a/lib/models/space_archive/item.dart b/lib/models/space_archive/item.dart index c75763c9..3ded3feb 100644 --- a/lib/models/space_archive/item.dart +++ b/lib/models/space_archive/item.dart @@ -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; diff --git a/lib/models/space_archive/space_archive.dart b/lib/models/space_archive/space_archive.dart index e3bf7d08..e2bfe9c1 100644 --- a/lib/models/space_archive/space_archive.dart +++ b/lib/models/space_archive/space_archive.dart @@ -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'; diff --git a/lib/models/space_article/author.dart b/lib/models/space_article/author.dart index 50c53634..3264e62a 100644 --- a/lib/models/space_article/author.dart +++ b/lib/models/space_article/author.dart @@ -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; diff --git a/lib/models/space_article/data.dart b/lib/models/space_article/data.dart index 999d8411..01b0ffa9 100644 --- a/lib/models/space_article/data.dart +++ b/lib/models/space_article/data.dart @@ -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'; diff --git a/lib/models/space_article/item.dart b/lib/models/space_article/item.dart index d4fb9e17..f7217d6e 100644 --- a/lib/models/space_article/item.dart +++ b/lib/models/space_article/item.dart @@ -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; diff --git a/lib/models/space_article/space_article.dart b/lib/models/space_article/space_article.dart index 23a2fc7d..03ca43b2 100644 --- a/lib/models/space_article/space_article.dart +++ b/lib/models/space_article/space_article.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'data.dart'; +import 'package:PiliPlus/models/space_article/data.dart'; part 'space_article.g.dart'; diff --git a/lib/models/space_article/vip.dart b/lib/models/space_article/vip.dart index 7959e0ba..ea0b805c 100644 --- a/lib/models/space_article/vip.dart +++ b/lib/models/space_article/vip.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'label.dart'; +import 'package:PiliPlus/models/space_article/label.dart'; part 'vip.g.dart'; diff --git a/lib/models/space_fav/datum.dart b/lib/models/space_fav/datum.dart index 14f53b7d..ff04033d 100644 --- a/lib/models/space_fav/datum.dart +++ b/lib/models/space_fav/datum.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'media_list_response.dart'; +import 'package:PiliPlus/models/space_fav/media_list_response.dart'; part 'datum.g.dart'; diff --git a/lib/models/space_fav/list.dart b/lib/models/space_fav/list.dart index 3293a373..0f0f63cf 100644 --- a/lib/models/space_fav/list.dart +++ b/lib/models/space_fav/list.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'upper.dart'; +import 'package:PiliPlus/models/space_fav/upper.dart'; part 'list.g.dart'; diff --git a/lib/models/space_fav/media_list_response.dart b/lib/models/space_fav/media_list_response.dart index 15a50e00..e75aa6f9 100644 --- a/lib/models/space_fav/media_list_response.dart +++ b/lib/models/space_fav/media_list_response.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'list.dart'; +import 'package:PiliPlus/models/space_fav/list.dart'; part 'media_list_response.g.dart'; diff --git a/lib/models/space_fav/space_fav.dart b/lib/models/space_fav/space_fav.dart index b954b0de..d0827b05 100644 --- a/lib/models/space_fav/space_fav.dart +++ b/lib/models/space_fav/space_fav.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'datum.dart'; +import 'package:PiliPlus/models/space_fav/datum.dart'; part 'space_fav.g.dart'; diff --git a/lib/models/user/fav_detail.dart b/lib/models/user/fav_detail.dart index 01a8f430..2a56787d 100644 --- a/lib/models/user/fav_detail.dart +++ b/lib/models/user/fav_detail.dart @@ -1,9 +1,9 @@ import 'package:PiliPlus/pages/common/multi_select_controller.dart' show MultiSelectData; -import '../model_owner.dart'; -import '../model_video.dart'; -import 'fav_folder.dart'; +import 'package:PiliPlus/models/model_owner.dart'; +import 'package:PiliPlus/models/model_video.dart'; +import 'package:PiliPlus/models/user/fav_folder.dart'; class FavDetailData { FavFolderItemData? info; diff --git a/lib/models/video/later.dart b/lib/models/video/later.dart index 0ee592e0..6096f29f 100644 --- a/lib/models/video/later.dart +++ b/lib/models/video/later.dart @@ -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'; class MediaVideoItemModel { MediaVideoItemModel({ diff --git a/lib/models/video/play/CDN.dart b/lib/models/video/play/CDN.dart index e3c07749..7a979337 100644 --- a/lib/models/video/play/CDN.dart +++ b/lib/models/video/play/CDN.dart @@ -25,7 +25,7 @@ enum CDNService { } extension CDNServiceDesc on CDNService { - static final List _descList = [ + static const List _descList = [ '基础 URL(不推荐)', '备用 URL', 'ali(阿里云)', @@ -52,7 +52,7 @@ extension CDNServiceDesc on CDNService { } extension CDNServiceHost on CDNService { - static final List _hostList = [ + static const List _hostList = [ '', '', 'upos-sz-mirrorali.bilivideo.com', @@ -79,7 +79,7 @@ extension CDNServiceHost on CDNService { } extension CDNServiceCode on CDNService { - static final List _codeList = [ + static const List _codeList = [ 'baseUrl', 'backupUrl', 'ali', diff --git a/lib/models/video/play/quality.dart b/lib/models/video/play/quality.dart index e41faa9c..cb1c7c21 100644 --- a/lib/models/video/play/quality.dart +++ b/lib/models/video/play/quality.dart @@ -16,7 +16,7 @@ enum VideoQuality { } extension VideoQualityCode on VideoQuality { - static final List _codeList = [ + static const List _codeList = [ 6, 16, 32, @@ -42,7 +42,7 @@ extension VideoQualityCode on VideoQuality { } extension VideoQualityDesc on VideoQuality { - static final List _descList = [ + static const List _descList = [ '240P 极速', '360P 流畅', '480P 清晰', @@ -62,7 +62,7 @@ extension VideoQualityDesc on VideoQuality { enum AudioQuality { k64, k132, k192, dolby, hiRes } extension AudioQualityCode on AudioQuality { - static final List _codeList = [ + static const List _codeList = [ 30216, 30232, 30280, @@ -81,7 +81,7 @@ extension AudioQualityCode on AudioQuality { } extension AudioQualityDesc on AudioQuality { - static final List _descList = [ + static const List _descList = [ '64K', '132K', '192K', @@ -99,12 +99,12 @@ enum VideoDecodeFormats { } extension VideoDecodeFormatsDesc on VideoDecodeFormats { - static final List _descList = ['DVH1', 'AV1', 'HEVC', 'AVC']; + static const List _descList = ['DVH1', 'AV1', 'HEVC', 'AVC']; String get description => _descList[index]; } extension VideoDecodeFormatsCode on VideoDecodeFormats { - static final List _codeList = ['dvh1', 'av01', 'hev1', 'avc1']; + static const List _codeList = ['dvh1', 'av01', 'hev1', 'avc1']; String get code => _codeList[index]; static VideoDecodeFormats? fromCode(String code) { diff --git a/lib/models/video/play/subtitle.dart b/lib/models/video/play/subtitle.dart index e27057c1..304f54e2 100644 --- a/lib/models/video/play/subtitle.dart +++ b/lib/models/video/play/subtitle.dart @@ -1,7 +1,7 @@ enum SubtitlePreference { off, on, withoutAi, auto } extension SubtitlePreferenceDesc on SubtitlePreference { - static final List _descList = [ + static const List _descList = [ '默认不显示字幕', '优先选择非自动生成(ai)字幕', '跳过自动生成(ai)字幕,选择第一个可用字幕', diff --git a/lib/models/video/reply/data.dart b/lib/models/video/reply/data.dart index 39ea6df2..761ff2db 100644 --- a/lib/models/video/reply/data.dart +++ b/lib/models/video/reply/data.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/models/video/reply/item.dart'; -import 'config.dart'; -import 'page.dart'; -import 'upper.dart'; +import 'package:PiliPlus/models/video/reply/config.dart'; +import 'package:PiliPlus/models/video/reply/page.dart'; +import 'package:PiliPlus/models/video/reply/upper.dart'; class ReplyData { ReplyData({ diff --git a/lib/models/video/reply/item.dart b/lib/models/video/reply/item.dart index 5d8c211f..5d41a58c 100644 --- a/lib/models/video/reply/item.dart +++ b/lib/models/video/reply/item.dart @@ -1,5 +1,5 @@ -import 'content.dart'; -import 'member.dart'; +import 'package:PiliPlus/models/video/reply/content.dart'; +import 'package:PiliPlus/models/video/reply/member.dart'; class ReplyItemModel { ReplyItemModel({ diff --git a/lib/models/video/reply/upper.dart b/lib/models/video/reply/upper.dart index 1d1f6071..879400a1 100644 --- a/lib/models/video/reply/upper.dart +++ b/lib/models/video/reply/upper.dart @@ -1,4 +1,4 @@ -import 'item.dart'; +import 'package:PiliPlus/models/video/reply/item.dart'; class ReplyUpper { ReplyUpper({ diff --git a/lib/models/video_detail_res.dart b/lib/models/video_detail_res.dart index eafa532b..015caf28 100644 --- a/lib/models/video_detail_res.dart +++ b/lib/models/video_detail_res.dart @@ -226,7 +226,7 @@ class DescV2 { this.bizId, }); - fromRawJson(String str) { + DescV2 fromRawJson(String str) { return DescV2.fromJson(json.decode(str)); } @@ -260,7 +260,7 @@ class Dimension { this.rotate, }); - fromRawJson(String str) => Dimension.fromJson(json.decode(str)); + Dimension fromRawJson(String str) => Dimension.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -330,7 +330,7 @@ class HonorReply { this.honor, }); - fromRawJson(String str) => HonorReply.fromJson(json.decode(str)); + HonorReply fromRawJson(String str) => HonorReply.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -360,7 +360,7 @@ class Honor { this.weeklyRecommendNum, }); - fromRawJson(String str) => Honor.fromJson(json.decode(str)); + Honor fromRawJson(String str) => Honor.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -394,7 +394,7 @@ class Owner { this.face, }); - fromRawJson(String str) => Owner.fromJson(json.decode(str)); + Owner fromRawJson(String str) => Owner.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -440,7 +440,7 @@ class Part { this.ctime, }); - fromRawJson(String str) => Part.fromJson(json.decode(str)); + Part fromRawJson(String str) => Part.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -505,7 +505,7 @@ class Stat { this.evaluation, }); - fromRawJson(String str) => Stat.fromJson(json.decode(str)); + Stat fromRawJson(String str) => Stat.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -552,7 +552,7 @@ class Subtitle { this.list, }); - fromRawJson(String str) => Subtitle.fromJson(json.decode(str)); + Subtitle fromRawJson(String str) => Subtitle.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); @@ -577,7 +577,7 @@ class UserGarb { this.urlImageAniCut, }); - fromRawJson(String str) => UserGarb.fromJson(json.decode(str)); + UserGarb fromRawJson(String str) => UserGarb.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); diff --git a/lib/pages/about/view.dart b/lib/pages/about/view.dart index e36cadeb..9c79ceba 100644 --- a/lib/pages/about/view.dart +++ b/lib/pages/about/view.dart @@ -130,7 +130,7 @@ class _AboutPageState extends State { ), ), ListTile( - title: Text( + title: const Text( ''' Build Time: ${BuildConfig.buildTime} Commit Hash: ${BuildConfig.commitHash}''', diff --git a/lib/pages/article/controller.dart b/lib/pages/article/controller.dart index 16a826fa..2751326b 100644 --- a/lib/pages/article/controller.dart +++ b/lib/pages/article/controller.dart @@ -63,7 +63,7 @@ class ArticleController extends ReplyController { } } - init() { + void init() { url = type == 'read' ? 'https://www.bilibili.com/read/cv$id' : 'https://www.bilibili.com/opus/$id'; diff --git a/lib/pages/article/view.dart b/lib/pages/article/view.dart index d278e681..80b2a2c1 100644 --- a/lib/pages/article/view.dart +++ b/lib/pages/article/view.dart @@ -54,45 +54,46 @@ class _ArticlePageState extends State late final _key = GlobalKey(); - get _getImageCallback => _horizontalPreview - ? (imgList, index) { - _imageStatus = true; - bool isFabVisible = _isFabVisible; - if (isFabVisible) { - _hideFab(); - } - final ctr = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 200), - )..forward(); - PageUtils.onHorizontalPreview( - _key, - AnimationController( - vsync: this, - duration: Duration.zero, - ), - ctr, - imgList, - index, - (value) async { - _imageStatus = null; + Function(dynamic imgList, dynamic index)? get _getImageCallback => + _horizontalPreview + ? (imgList, index) { + _imageStatus = true; + bool isFabVisible = _isFabVisible; if (isFabVisible) { - isFabVisible = false; - _showFab(); + _hideFab(); } - if (value == false) { - await ctr.reverse(); - } - try { - ctr.dispose(); - } catch (_) {} - if (value == false) { - Get.back(); - } - }, - ); - } - : null; + final ctr = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 200), + )..forward(); + PageUtils.onHorizontalPreview( + _key, + AnimationController( + vsync: this, + duration: Duration.zero, + ), + ctr, + imgList, + index, + (value) async { + _imageStatus = null; + if (isFabVisible) { + isFabVisible = false; + _showFab(); + } + if (value == false) { + await ctr.reverse(); + } + try { + ctr.dispose(); + } catch (_) {} + if (value == false) { + Get.back(); + } + }, + ); + } + : null; @override void initState() { @@ -380,7 +381,7 @@ class _ArticlePageState extends State ); } } else { - content = SliverToBoxAdapter(child: Text('NULL')); + content = const SliverToBoxAdapter(child: Text('NULL')); } int? pubTime = @@ -392,7 +393,7 @@ class _ArticlePageState extends State SliverToBoxAdapter( child: Text( _articleCtr.summary.title!, - style: TextStyle( + style: const TextStyle( fontSize: 17, fontWeight: FontWeight.bold, ), @@ -568,7 +569,7 @@ class _ArticlePageState extends State builder: (context) => Align( alignment: Alignment.topRight, child: Container( - margin: EdgeInsets.only( + margin: const EdgeInsets.only( top: 56, right: 16, ), @@ -599,7 +600,7 @@ class _ArticlePageState extends State }, icon: Transform.rotate( angle: pi / 2, - child: Icon(Icons.splitscreen, size: 19), + child: const Icon(Icons.splitscreen, size: 19), ), ), IconButton( @@ -686,7 +687,7 @@ class _ArticlePageState extends State child: SlideTransition( position: Tween( begin: const Offset(0, 1), - end: const Offset(0, 0), + end: Offset.zero, ).animate(CurvedAnimation( parent: fabAnimationCtr, curve: Curves.easeInOut, diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 3233a12a..a774440a 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -249,7 +249,7 @@ class OpusContent extends StatelessWidget { if (element.linkCard?.card?.itemNull?.icon ?.isNullOrEmpty == true) - Icon(Icons.info, size: 20), + const Icon(Icons.info, size: 20), Text(' ${element.linkCard?.card?.itemNull?.text}'), ], ), diff --git a/lib/pages/bangumi/view.dart b/lib/pages/bangumi/view.dart index 8976b674..8199d590 100644 --- a/lib/pages/bangumi/view.dart +++ b/lib/pages/bangumi/view.dart @@ -70,16 +70,6 @@ class _BangumiPageState extends CommonPageState ); } - late final List weekList = [ - '一', - '二', - '三', - '四', - '五', - '六', - '日', - ]; - Widget _buildTimeline( ThemeData theme, LoadingState?> loadingState) => switch (loadingState) { @@ -131,14 +121,22 @@ class _BangumiPageState extends CommonPageState ?.copyWith(fontSize: 14) ?? const TextStyle(fontSize: 14), dividerColor: Colors.transparent, - tabs: loadingState.response! - .map( - (item) => Tab( - text: - '${item.date} ${item.isToday == 1 ? '今天' : '周${weekList[item.dayOfWeek! - 1]}'}', - ), - ) - .toList(), + tabs: loadingState.response!.map( + (item) { + return Tab( + text: + '${item.date} ${item.isToday == 1 ? '今天' : '周${const [ + '一', + '二', + '三', + '四', + '五', + '六', + '日', + ][item.dayOfWeek! - 1]}'}', + ); + }, + ).toList(), ), ), ), @@ -228,7 +226,7 @@ class _BangumiPageState extends CommonPageState behavior: HitTestBehavior.opaque, onTap: () { if (widget.tabType == TabType.bangumi) { - Get.to(PgcIndexPage()); + Get.to(const PgcIndexPage()); } else { List titles = const [ '全部', @@ -274,7 +272,7 @@ class _BangumiPageState extends CommonPageState children: [ Text( '查看更多', - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: const StrutStyle(leading: 0, height: 1), style: TextStyle( height: 1, color: theme.colorScheme.secondary, @@ -393,7 +391,8 @@ class _BangumiPageState extends CommonPageState children: [ Text( '查看全部', - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: + const StrutStyle(leading: 0, height: 1), style: TextStyle( height: 1, color: theme.colorScheme.secondary, diff --git a/lib/pages/bangumi/widgets/bangumi_card_v.dart b/lib/pages/bangumi/widgets/bangumi_card_v.dart index d0f20f06..6f081b3d 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v.dart @@ -1,7 +1,6 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -33,52 +32,49 @@ class BangumiCardV extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipRRect( - borderRadius: StyleString.mdRadius, - child: AspectRatio( - aspectRatio: 0.75, - child: LayoutBuilder(builder: (context, boxConstraints) { - final double maxWidth = boxConstraints.maxWidth; - final double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - Hero( - tag: heroTag, - child: NetworkImgLayer( - src: bangumiItem.cover, - width: maxWidth, - height: maxHeight, - ), + AspectRatio( + aspectRatio: 0.75, + child: LayoutBuilder(builder: (context, boxConstraints) { + final double maxWidth = boxConstraints.maxWidth; + final double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + Hero( + tag: heroTag, + child: NetworkImgLayer( + src: bangumiItem.cover, + width: maxWidth, + height: maxHeight, ), + ), + PBadge( + text: bangumiItem.badge, + top: 6, + right: 6, + bottom: null, + left: null, + ), + if (bangumiItem.isFinish == 0 && + bangumiItem.renewalTime?.isNotEmpty == true) PBadge( - text: bangumiItem.badge, - top: 6, - right: 6, - bottom: null, - left: null, + text: bangumiItem.renewalTime, + bottom: 6, + left: 6, + type: 'gray', + ) + else if (bangumiItem.order != null) + PBadge( + text: bangumiItem.order, + top: null, + right: null, + bottom: 6, + left: 6, + type: 'gray', ), - if (bangumiItem.isFinish == 0 && - bangumiItem.renewalTime?.isNotEmpty == true) - PBadge( - text: bangumiItem.renewalTime, - bottom: 6, - left: 6, - type: 'gray', - ) - else if (bangumiItem.order != null) - PBadge( - text: bangumiItem.order, - top: null, - right: null, - bottom: 6, - left: 6, - type: 'gray', - ), - ], - ); - }), - ), + ], + ); + }), ), bagumiContent(context) ], diff --git a/lib/pages/bangumi/widgets/bangumi_card_v_member_home.dart b/lib/pages/bangumi/widgets/bangumi_card_v_member_home.dart index 44d8345c..31b37c95 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v_member_home.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v_member_home.dart @@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/models/space_archive/item.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -33,26 +32,18 @@ class BangumiCardVMemberHome extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipRRect( - borderRadius: const BorderRadius.only( - topLeft: StyleString.imgRadius, - topRight: StyleString.imgRadius, - bottomLeft: StyleString.imgRadius, - bottomRight: StyleString.imgRadius, - ), - child: AspectRatio( - aspectRatio: 0.75, - child: LayoutBuilder(builder: (context, boxConstraints) { - return Hero( - tag: heroTag, - child: NetworkImgLayer( - src: bangumiItem.cover, - width: boxConstraints.maxWidth, - height: boxConstraints.maxHeight, - ), - ); - }), - ), + AspectRatio( + aspectRatio: 0.75, + child: LayoutBuilder(builder: (context, boxConstraints) { + return Hero( + tag: heroTag, + child: NetworkImgLayer( + src: bangumiItem.cover, + width: boxConstraints.maxWidth, + height: boxConstraints.maxHeight, + ), + ); + }), ), bangumiContent(bangumiItem) ], diff --git a/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart b/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart index a76f44f3..d93a12c6 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v_pgc_index.dart @@ -1,7 +1,6 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -30,40 +29,37 @@ class BangumiCardVPgcIndex extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipRRect( - borderRadius: StyleString.mdRadius, - child: AspectRatio( - aspectRatio: 0.75, - child: LayoutBuilder(builder: (context, boxConstraints) { - final double maxWidth = boxConstraints.maxWidth; - final double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - NetworkImgLayer( - src: bangumiItem['cover'], - width: maxWidth, - height: maxHeight, - ), - PBadge( - text: bangumiItem['badge'], - top: 6, - right: 6, - bottom: null, - left: null, - ), - PBadge( - text: bangumiItem['order'], - top: null, - right: null, - bottom: 6, - left: 6, - type: 'gray', - ), - ], - ); - }), - ), + AspectRatio( + aspectRatio: 0.75, + child: LayoutBuilder(builder: (context, boxConstraints) { + final double maxWidth = boxConstraints.maxWidth; + final double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + NetworkImgLayer( + src: bangumiItem['cover'], + width: maxWidth, + height: maxHeight, + ), + PBadge( + text: bangumiItem['badge'], + top: 6, + right: 6, + bottom: null, + left: null, + ), + PBadge( + text: bangumiItem['order'], + top: null, + right: null, + bottom: 6, + left: 6, + type: 'gray', + ), + ], + ); + }), ), bagumiContent(context) ], diff --git a/lib/pages/bangumi/widgets/bangumi_card_v_search.dart b/lib/pages/bangumi/widgets/bangumi_card_v_search.dart index fba381d5..5e8f6099 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v_search.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v_search.dart @@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/models/search/result.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -31,30 +30,27 @@ class BangumiCardVSearch extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipRRect( - borderRadius: StyleString.mdRadius, - child: AspectRatio( - aspectRatio: 0.75, - child: LayoutBuilder(builder: (context, boxConstraints) { - final double maxWidth = boxConstraints.maxWidth; - final double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - NetworkImgLayer( - src: item.cover, - width: maxWidth, - height: maxHeight, - ), - PBadge( - text: item.seasonTypeName, - right: 6, - top: 6, - ), - ], - ); - }), - ), + AspectRatio( + aspectRatio: 0.75, + child: LayoutBuilder(builder: (context, boxConstraints) { + final double maxWidth = boxConstraints.maxWidth; + final double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + NetworkImgLayer( + src: item.cover, + width: maxWidth, + height: maxHeight, + ), + PBadge( + text: item.seasonTypeName, + right: 6, + top: 6, + ), + ], + ); + }), ), bagumiContent(context) ], diff --git a/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart b/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart index 149c9c35..f3116f20 100644 --- a/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart +++ b/lib/pages/bangumi/widgets/bangumi_card_v_timeline.dart @@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/models/bangumi/pgc_timeline/episode.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -31,37 +30,34 @@ class BangumiCardVTimeline extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ClipRRect( - borderRadius: StyleString.mdRadius, - child: AspectRatio( - aspectRatio: 0.75, - child: LayoutBuilder(builder: (context, boxConstraints) { - final double maxWidth = boxConstraints.maxWidth; - final double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - NetworkImgLayer( - src: item.cover, - width: maxWidth, - height: maxHeight, + AspectRatio( + aspectRatio: 0.75, + child: LayoutBuilder(builder: (context, boxConstraints) { + final double maxWidth = boxConstraints.maxWidth; + final double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + NetworkImgLayer( + src: item.cover, + width: maxWidth, + height: maxHeight, + ), + if (item.follow == 1) + const PBadge( + text: '已追番', + right: 6, + top: 6, ), - if (item.follow == 1) - PBadge( - text: '已追番', - right: 6, - top: 6, - ), - PBadge( - text: '${item.pubTime}', - left: 6, - bottom: 6, - type: 'gray', - ), - ], - ); - }), - ), + PBadge( + text: '${item.pubTime}', + left: 6, + bottom: 6, + type: 'gray', + ), + ], + ); + }), ), bagumiContent(context) ], diff --git a/lib/pages/common/common_collapse_slide_page.dart b/lib/pages/common/common_collapse_slide_page.dart index 68482e5a..955105cf 100644 --- a/lib/pages/common/common_collapse_slide_page.dart +++ b/lib/pages/common/common_collapse_slide_page.dart @@ -28,8 +28,8 @@ abstract class CommonCollapseSlidePageState @override Widget build(BuildContext context) { if (isInit) { - return CustomScrollView( - physics: const NeverScrollableScrollPhysics(), + return const CustomScrollView( + physics: NeverScrollableScrollPhysics(), ); } diff --git a/lib/pages/common/common_publish_page.dart b/lib/pages/common/common_publish_page.dart index ed8bab24..d503ab2a 100644 --- a/lib/pages/common/common_publish_page.dart +++ b/lib/pages/common/common_publish_page.dart @@ -78,7 +78,7 @@ abstract class CommonPublishPageState super.dispose(); } - void _requestFocus() async { + Future _requestFocus() async { await Future.delayed(const Duration(microseconds: 200)); focusNode.requestFocus(); } @@ -104,7 +104,7 @@ abstract class CommonPublishPageState } } - updatePanelType(PanelType type) async { + Future updatePanelType(PanelType type) async { final isSwitchToKeyboard = PanelType.keyboard == type; final isSwitchToEmojiPanel = PanelType.emoji == type; bool isUpdated = false; @@ -119,7 +119,7 @@ abstract class CommonPublishPageState break; } - updatePanelTypeFunc() { + void updatePanelTypeFunc() { controller.updatePanelType( isSwitchToKeyboard ? ChatBottomPanelType.keyboard @@ -141,7 +141,7 @@ abstract class CommonPublishPageState } } - hidePanel() async { + Future hidePanel() async { if (focusNode.hasFocus) { await Future.delayed(const Duration(milliseconds: 100)); focusNode.unfocus(); @@ -224,7 +224,7 @@ abstract class CommonPublishPageState widget.onSave?.call(editController.text); } - Widget? customPanel(double height) => null; + Widget? get customPanel => null; Widget buildEmojiPickerPanel() { double height = 170; @@ -232,7 +232,10 @@ abstract class CommonPublishPageState if (keyboardHeight != 0) { height = max(height, keyboardHeight); } - return customPanel(height) ?? SizedBox(height: height); + return SizedBox( + height: height, + child: customPanel, + ); } Widget buildPanelContainer([Color? panelBgColor]) { @@ -342,7 +345,7 @@ abstract class CommonPublishPageState ); } - void onCropImage(int index) async { + Future onCropImage(int index) async { final theme = Theme.of(context); CroppedFile? croppedFile = await ImageCropper().cropImage( sourcePath: pathList[index], diff --git a/lib/pages/common/common_search_page.dart b/lib/pages/common/common_search_page.dart index fb1eaaeb..bb326d07 100644 --- a/lib/pages/common/common_search_page.dart +++ b/lib/pages/common/common_search_page.dart @@ -64,7 +64,7 @@ abstract class CommonSearchPageState Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { - Loading() => HttpError(), + Loading() => const HttpError(), Success() => loadingState.response?.isNotEmpty == true ? buildList(loadingState.response!) : HttpError( diff --git a/lib/pages/common/reply_controller.dart b/lib/pages/common/reply_controller.dart index f8c01211..fe145c4a 100644 --- a/lib/pages/common/reply_controller.dart +++ b/lib/pages/common/reply_controller.dart @@ -94,7 +94,7 @@ abstract class ReplyController extends CommonListController { } // 排序搜索评论 - queryBySort() { + void queryBySort() { EasyThrottle.throttle('queryBySort', const Duration(seconds: 1), () { feedBack(); switch (sortType.value) { @@ -251,7 +251,7 @@ abstract class ReplyController extends CommonListController { } // ref https://github.com/freedom-introvert/biliSendCommAntifraud - void checkReply({ + Future checkReply({ required BuildContext context, required dynamic oid, required dynamic rpid, @@ -304,7 +304,7 @@ abstract class ReplyController extends CommonListController { showDialog( context: context, builder: (context) => AlertDialog( - title: Text('评论检查结果'), + title: const Text('评论检查结果'), content: SelectableText(message), ), ); @@ -479,7 +479,7 @@ https://api.bilibili.com/x/v2/reply/reply?oid=$oid&pn=1&ps=20&root=${rpid ?? rep } } - void onToggleTop(index, oid, int type, bool isUpTop, int rpid) async { + Future onToggleTop(index, oid, int type, bool isUpTop, int rpid) async { final res = await ReplyHttp.replyTop( oid: oid, type: type, diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index ed9d32ca..dcdcc80e 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -25,7 +25,7 @@ class PlDanmakuController { return progress ~/ segmentLength; } - void queryDanmaku(int segmentIndex) async { + Future queryDanmaku(int segmentIndex) async { if (requestedSeg[segmentIndex] == true) { return; } diff --git a/lib/pages/danmaku/view.dart b/lib/pages/danmaku/view.dart index dc02a49f..bba57c8d 100644 --- a/lib/pages/danmaku/view.dart +++ b/lib/pages/danmaku/view.dart @@ -144,8 +144,9 @@ class _PlDanmakuState extends State { @override void dispose() { _listenerFS?.cancel(); - playerController.removePositionListener(videoPositionListen); - playerController.removeStatusLister(playerListener); + playerController + ..removePositionListener(videoPositionListen) + ..removeStatusLister(playerListener); _plDanmakuController.dispose(); super.dispose(); } diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index f3d3a5b2..b7602d1d 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -62,7 +62,7 @@ class DynamicsController extends GetxController queryFollowUp(); } - onSelectType(value) async { + Future onSelectType(value) async { initialValue.value = value; } @@ -164,9 +164,12 @@ class DynamicsController extends GetxController isQuerying = false; } - onSelectUp(mid) async { + Future onSelectUp(mid) async { if (this.mid == mid) { tabController.index = (mid == -1 ? 0 : 4); + if (mid == -1) { + queryFollowUp(); + } controller.onReload(); return; } @@ -176,13 +179,13 @@ class DynamicsController extends GetxController } @override - onRefresh() async { + Future onRefresh() async { queryFollowUp(); await controller.onRefresh(); } @override - void animateToTop() async { + Future animateToTop() async { controller.animateToTop(); scrollController.animToTop(); } diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index 4b6e8d8a..7ffa2aa5 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -7,14 +7,14 @@ import 'package:get/get.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -import 'controller.dart'; -import 'widgets/up_panel.dart'; +import 'package:PiliPlus/pages/dynamics/controller.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/up_panel.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; enum ReplyOption { allow, close, choose } extension ReplyOptionExtension on ReplyOption { - String get title => ['允许评论', '关闭评论', '精选评论'][index]; + String get title => const ['允许评论', '关闭评论', '精选评论'][index]; IconData get iconData => [ MdiIcons.commentTextOutline, @@ -82,9 +82,7 @@ class _DynamicsPageState extends State @override void initState() { super.initState(); - upPanelPosition = UpPanelPosition.values[GStorage.setting.get( - SettingBoxKey.upPanelPosition, - defaultValue: UpPanelPosition.leftFixed.index)]; + upPanelPosition = GStorage.upPanelPosition; debugPrint('upPanelPosition: $upPanelPosition'); if (GStorage.setting .get(SettingBoxKey.dynamicsShowAllFollowedUp, defaultValue: false)) { @@ -122,7 +120,7 @@ class _DynamicsPageState extends State } else if (_dynamicsController.upData.value.errMsg != null) { return Center( child: IconButton( - icon: Icon(Icons.refresh), + icon: const Icon(Icons.refresh), onPressed: () { _dynamicsController.queryFollowUp(); }, diff --git a/lib/pages/dynamics/widgets/action_panel.dart b/lib/pages/dynamics/widgets/action_panel.dart index e6bc4b84..5180c528 100644 --- a/lib/pages/dynamics/widgets/action_panel.dart +++ b/lib/pages/dynamics/widgets/action_panel.dart @@ -22,7 +22,7 @@ class ActionPanel extends StatefulWidget { class _ActionPanelState extends State { bool isProcessing = false; - void handleState(Future Function() action) async { + Future handleState(Future Function() action) async { if (isProcessing.not) { isProcessing = true; await action(); diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 44f603ea..07dad64e 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -221,7 +221,7 @@ class AuthorPanel extends StatelessWidget { void morePanel(BuildContext context) { String? bvid; try { - getBvid(String? type, DynamicMajorModel? major) => switch (type) { + String? getBvid(String? type, DynamicMajorModel? major) => switch (type) { 'DYNAMIC_TYPE_AV' => major?.archive?.bvid, 'DYNAMIC_TYPE_UGC_SEASON' => major?.ugcSeason?.bvid, _ => null, diff --git a/lib/pages/dynamics/widgets/content_panel.dart b/lib/pages/dynamics/widgets/content_panel.dart index f61b3861..4607968a 100644 --- a/lib/pages/dynamics/widgets/content_panel.dart +++ b/lib/pages/dynamics/widgets/content_panel.dart @@ -3,7 +3,7 @@ import 'package:PiliPlus/common/widgets/image/image_view.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:flutter/material.dart'; -import 'rich_node_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart'; Widget content( ThemeData theme, @@ -52,7 +52,9 @@ Widget content( source == 'detail' ? SelectableText.rich( richNodes, - style: TextStyle(fontSize: !isSave ? 16 : 15), + style: !isSave + ? const TextStyle(fontSize: 16) + : const TextStyle(fontSize: 15), ) : Text.rich( style: const TextStyle(fontSize: 15), diff --git a/lib/pages/dynamics/widgets/dynamic_panel.dart b/lib/pages/dynamics/widgets/dynamic_panel.dart index 4aa91292..e75db694 100644 --- a/lib/pages/dynamics/widgets/dynamic_panel.dart +++ b/lib/pages/dynamics/widgets/dynamic_panel.dart @@ -4,10 +4,10 @@ import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'action_panel.dart'; -import 'author_panel.dart'; -import 'content_panel.dart'; -import 'forward_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/action_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/author_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/content_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/forward_panel.dart'; class DynamicPanel extends StatelessWidget { final DynamicItemModel item; @@ -37,55 +37,60 @@ class DynamicPanel extends StatelessWidget { isSave: isSave, onSetTop: onSetTop, ); - return Container( - decoration: isSave || - (source == 'detail' && - Get.context!.orientation == Orientation.landscape) - ? null - : BoxDecoration( - border: Border( - bottom: BorderSide( - width: 8, - color: theme.dividerColor.withOpacity(0.05), - ), - ), + final child = Material( + elevation: 0, + color: Colors.transparent, + child: InkWell( + onTap: source == 'detail' && + const { + 'DYNAMIC_TYPE_AV', + 'DYNAMIC_TYPE_UGC_SEASON', + 'DYNAMIC_TYPE_PGC_UNION', + 'DYNAMIC_TYPE_PGC', + 'DYNAMIC_TYPE_LIVE', + 'DYNAMIC_TYPE_LIVE_RCMD', + 'DYNAMIC_TYPE_MEDIALIST', + }.contains(item.type).not + ? null + : () => PageUtils.pushDynDetail(item, 1), + onLongPress: () => _imageSaveDialog(context, authorWidget.morePanel), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 6), + child: authorWidget, ), - child: Material( - elevation: 0, - color: Colors.transparent, - child: InkWell( - onTap: source == 'detail' && - const { - 'DYNAMIC_TYPE_AV', - 'DYNAMIC_TYPE_UGC_SEASON', - 'DYNAMIC_TYPE_PGC_UNION', - 'DYNAMIC_TYPE_PGC', - 'DYNAMIC_TYPE_LIVE', - 'DYNAMIC_TYPE_LIVE_RCMD', - 'DYNAMIC_TYPE_MEDIALIST', - }.contains(item.type).not - ? null - : () => PageUtils.pushDynDetail(item, 1), - onLongPress: () => _imageSaveDialog(context, authorWidget.morePanel), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(12, 12, 12, 6), - child: authorWidget, - ), - if (item.modules.moduleDynamic!.desc != null || - item.modules.moduleDynamic!.major != null) - content(theme, isSave, context, item, source, callback), - forWard(theme, isSave, item, context, source, callback), - const SizedBox(height: 2), - if (source == null) ActionPanel(item: item), - if (source == 'detail' && !isSave) const SizedBox(height: 12), - ], + if (item.modules.moduleDynamic!.desc != null || + item.modules.moduleDynamic!.major != null) + content(theme, isSave, context, item, source, callback), + forWard(theme, isSave, item, context, source, callback), + const SizedBox(height: 2), + if (source == null) ActionPanel(item: item), + if (source == 'detail' && !isSave) const SizedBox(height: 12), + ], + ), + ), + ); + if (isSave || + (source == 'detail' && + Get.context!.orientation == Orientation.landscape)) { + return child; + } + return DecoratedBox( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 8, + color: theme.dividerColor.withOpacity(0.05), ), ), ), + child: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: child, + ), ); } diff --git a/lib/pages/dynamics/widgets/forward_panel.dart b/lib/pages/dynamics/widgets/forward_panel.dart index 8f92c212..e781e728 100644 --- a/lib/pages/dynamics/widgets/forward_panel.dart +++ b/lib/pages/dynamics/widgets/forward_panel.dart @@ -45,7 +45,7 @@ InlineSpan picsNodes( Widget _blockedItem(ThemeData theme, ModuleBlocked moduleBlocked) { return Padding( - padding: EdgeInsets.symmetric(horizontal: 13, vertical: 1), + padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 1), child: LayoutBuilder( builder: (context, constraints) { return moduleBlockedItem(theme, moduleBlocked, constraints.maxWidth); @@ -66,9 +66,6 @@ Widget forWard( switch (item.type) { // 图文 case 'DYNAMIC_TYPE_DRAW': - bool hasPics = - item.modules.moduleDynamic?.major?.opus?.pics?.isNotEmpty == true; - TextSpan? richNodes = richNode(theme, item, context); return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -110,12 +107,12 @@ Widget forWard( ? null : TextOverflow.ellipsis, ), - if (hasPics) ...[ + if (item.modules.moduleDynamic?.major?.opus?.pics?.isNotEmpty == + true) Text.rich( picsNodes( item.modules.moduleDynamic!.major!.opus!.pics!, callback), ), - ], const SizedBox(height: 4), ], Padding( diff --git a/lib/pages/dynamics/widgets/live_panel.dart b/lib/pages/dynamics/widgets/live_panel.dart index 5d57a639..097b6e2b 100644 --- a/lib/pages/dynamics/widgets/live_panel.dart +++ b/lib/pages/dynamics/widgets/live_panel.dart @@ -5,7 +5,7 @@ import 'package:get/get.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'rich_node_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart'; Widget livePanel( ThemeData theme, diff --git a/lib/pages/dynamics/widgets/live_rcmd_panel.dart b/lib/pages/dynamics/widgets/live_rcmd_panel.dart index 7567f765..20acc6a4 100644 --- a/lib/pages/dynamics/widgets/live_rcmd_panel.dart +++ b/lib/pages/dynamics/widgets/live_rcmd_panel.dart @@ -7,7 +7,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'rich_node_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart'; Widget liveRcmdPanel( ThemeData theme, diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index 3f959ac4..4a4c58c2 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -73,47 +73,45 @@ TextSpan? richNode( spanChildren.add( WidgetSpan( alignment: PlaceholderAlignment.middle, - child: GestureDetector( - onTap: () {}, - child: Text( - '${i.origText}', - style: authorStyle, - ), + child: Text( + '${i.origText}', + style: authorStyle, ), ), ); break; // 网页链接 case 'RICH_TEXT_NODE_TYPE_WEB': - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: Icon( - Icons.link, - size: 20, - color: theme.colorScheme.primary, - ), - ), - ); - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: GestureDetector( - onTap: () { - String? url = i.origText; - if (url == null) { - SmartDialog.showToast('未获取到链接'); - return; - } - PiliScheme.routePushFromUrl(url); - }, - child: Text( - i.text ?? '', - style: authorStyle, + spanChildren + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Icon( + Icons.link, + size: 20, + color: theme.colorScheme.primary, ), ), - ), - ); + ) + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: GestureDetector( + onTap: () { + String? url = i.origText; + if (url == null) { + SmartDialog.showToast('未获取到链接'); + return; + } + PiliScheme.routePushFromUrl(url); + }, + child: Text( + i.text ?? '', + style: authorStyle, + ), + ), + ), + ); break; // 投票 case 'RICH_TEXT_NODE_TYPE_VOTE': @@ -148,121 +146,122 @@ TextSpan? richNode( break; // 抽奖 case 'RICH_TEXT_NODE_TYPE_LOTTERY': - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: Icon( - Icons.redeem_rounded, - size: 16, - color: theme.colorScheme.primary, - ), - ), - ); - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: GestureDetector( - onTap: () { - Get.toNamed( - '/webview', - parameters: { - 'url': - 'https://www.bilibili.com/h5/lottery/result?business_id=${item.idStr}' - }, - ); - }, - child: Text( - '${i.origText} ', - style: authorStyle, + spanChildren + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Icon( + Icons.redeem_rounded, + size: 16, + color: theme.colorScheme.primary, ), ), - ), - ); + ) + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: GestureDetector( + onTap: () { + Get.toNamed( + '/webview', + parameters: { + 'url': + 'https://www.bilibili.com/h5/lottery/result?business_id=${item.idStr}' + }, + ); + }, + child: Text( + '${i.origText} ', + style: authorStyle, + ), + ), + ), + ); break; /// TODO 商品 case 'RICH_TEXT_NODE_TYPE_GOODS': - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: Icon( - Icons.shopping_bag_outlined, - size: 16, - color: theme.colorScheme.primary, + spanChildren + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Icon( + Icons.shopping_bag_outlined, + size: 16, + color: theme.colorScheme.primary, + ), ), - ), - ); - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: GestureDetector( - onTap: () {}, + ) + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, child: Text( '${i.text} ', style: authorStyle, ), ), - ), - ); + ); break; // 投稿 case 'RICH_TEXT_NODE_TYPE_BV': - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: Icon( - Icons.play_circle_outline_outlined, - size: 16, - color: theme.colorScheme.primary, - ), - ), - ); - spanChildren.add( - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: GestureDetector( - onTap: () async { - try { - int cid = await SearchHttp.ab2c(bvid: i.rid); - PageUtils.toVideoPage( - 'bvid=${i.rid}&cid=$cid', - arguments: { - 'heroTag': Utils.makeHeroTag(i.rid), - }, - ); - } catch (err) { - SmartDialog.showToast(err.toString()); - } - }, - child: Text( - '${i.text} ', - style: authorStyle, + spanChildren + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Icon( + Icons.play_circle_outline_outlined, + size: 16, + color: theme.colorScheme.primary, ), ), - ), - ); + ) + ..add( + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: GestureDetector( + onTap: () async { + try { + int cid = await SearchHttp.ab2c(bvid: i.rid); + PageUtils.toVideoPage( + 'bvid=${i.rid}&cid=$cid', + arguments: { + 'heroTag': Utils.makeHeroTag(i.rid), + }, + ); + } catch (err) { + SmartDialog.showToast(err.toString()); + } + }, + child: Text( + '${i.text} ', + style: authorStyle, + ), + ), + ), + ); break; case 'RICH_TEXT_NODE_TYPE_VIEW_PICTURE' when (i.pics?.isNotEmpty == true): - spanChildren.add(TextSpan(text: '\n')); - spanChildren.add( - WidgetSpan( - child: LayoutBuilder( - builder: (context, constraints) { - return imageView( - constraints.maxWidth, - i.pics! - .map((item) => ImageModel( - url: item.src ?? '', - width: item.width, - height: item.height, - )) - .toList(), - ); - }, + spanChildren + ..add(const TextSpan(text: '\n')) + ..add( + WidgetSpan( + child: LayoutBuilder( + builder: (context, constraints) { + return imageView( + constraints.maxWidth, + i.pics! + .map((item) => ImageModel( + url: item.src ?? '', + width: item.width, + height: item.height, + )) + .toList(), + ); + }, + ), ), - ), - ); + ); break; default: spanChildren.add( diff --git a/lib/pages/dynamics/widgets/video_panel.dart b/lib/pages/dynamics/widgets/video_panel.dart index 472f441c..dd034391 100644 --- a/lib/pages/dynamics/widgets/video_panel.dart +++ b/lib/pages/dynamics/widgets/video_panel.dart @@ -7,7 +7,7 @@ import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/utils/utils.dart'; -import 'rich_node_panel.dart'; +import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart'; Widget videoSeasonWidget( ThemeData theme, @@ -89,8 +89,8 @@ Widget videoSeasonWidget( alignment: Alignment.bottomLeft, padding: const EdgeInsets.fromLTRB(10, 0, 8, 8), clipBehavior: Clip.hardEdge, - decoration: BoxDecoration( - gradient: const LinearGradient( + decoration: const BoxDecoration( + gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ @@ -98,7 +98,7 @@ Widget videoSeasonWidget( Colors.black54, ], ), - borderRadius: const BorderRadius.only( + borderRadius: BorderRadius.only( bottomLeft: StyleString.imgRadius, bottomRight: StyleString.imgRadius, ), diff --git a/lib/pages/dynamics/widgets/vote.dart b/lib/pages/dynamics/widgets/vote.dart index 956a269c..5f5204fe 100644 --- a/lib/pages/dynamics/widgets/vote.dart +++ b/lib/pages/dynamics/widgets/vote.dart @@ -78,7 +78,7 @@ class _VotePanelState extends State { text: _voteInfo.joinNum.toString(), style: TextStyle(color: theme.colorScheme.primary), ), - TextSpan(text: '人参与'), + const TextSpan(text: '人参与'), ], ), ), @@ -107,7 +107,7 @@ class _VotePanelState extends State { Flexible(fit: FlexFit.loose, child: _buildContext()), if (_enabled) Padding( - padding: EdgeInsets.only(top: 16), + padding: const EdgeInsets.only(top: 16), child: ValueListenableBuilder( valueListenable: _canVote, builder: (_, val, __) => OutlinedButton( diff --git a/lib/pages/dynamics_create/view.dart b/lib/pages/dynamics_create/view.dart index d5ebcbd9..4711841c 100644 --- a/lib/pages/dynamics_create/view.dart +++ b/lib/pages/dynamics_create/view.dart @@ -100,9 +100,9 @@ class _CreateDynPanelState extends CommonPublishPageState { itemBuilder: (context, index) { if (pathList.length != limit && index == pathList.length) { return Material( - borderRadius: BorderRadius.circular(12), + borderRadius: const BorderRadius.all(Radius.circular(12)), child: InkWell( - borderRadius: BorderRadius.circular(12), + borderRadius: const BorderRadius.all(Radius.circular(12)), onTap: () { onPickImage(() { if (pathList.isNotEmpty && !enablePublish.value) { @@ -114,10 +114,11 @@ class _CreateDynPanelState extends CommonPublishPageState { width: 100, height: 100, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), + borderRadius: + const BorderRadius.all(Radius.circular(12)), color: theme.colorScheme.secondaryContainer, ), - child: Center(child: Icon(Icons.add, size: 35)), + child: const Center(child: Icon(Icons.add, size: 35)), ), ), ); @@ -131,7 +132,7 @@ class _CreateDynPanelState extends CommonPublishPageState { ); PreferredSizeWidget _buildAppBar(ThemeData theme) => PreferredSize( - preferredSize: Size.fromHeight(66), + preferredSize: const Size.fromHeight(66), child: Padding( padding: const EdgeInsets.all(16), child: Stack( @@ -162,8 +163,8 @@ class _CreateDynPanelState extends CommonPublishPageState { ), ), ), - Center( - child: const Text( + const Center( + child: Text( '发布动态', style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), ), @@ -179,10 +180,7 @@ class _CreateDynPanelState extends CommonPublishPageState { horizontal: 20, vertical: 10, ), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), child: Text(_publishTime == null ? '发布' : '定时发布'), ), @@ -239,7 +237,7 @@ class _CreateDynPanelState extends CommonPublishPageState { height: 1, color: color, ), - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: const StrutStyle(leading: 0, height: 1), ), Icon( size: 20, @@ -299,7 +297,7 @@ class _CreateDynPanelState extends CommonPublishPageState { height: 1, color: color, ), - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: const StrutStyle(leading: 0, height: 1), ), Icon( size: 20, @@ -319,10 +317,7 @@ class _CreateDynPanelState extends CommonPublishPageState { horizontal: 16, vertical: 10, ), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), onPressed: _isPrivate ? null @@ -387,10 +382,7 @@ class _CreateDynPanelState extends CommonPublishPageState { horizontal: 16, vertical: 10, ), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), onPressed: () { setState(() { @@ -398,7 +390,7 @@ class _CreateDynPanelState extends CommonPublishPageState { }); }, label: Text(DateFormat('yyyy-MM-dd HH:mm').format(_publishTime!)), - icon: Icon(Icons.clear, size: 20), + icon: const Icon(Icons.clear, size: 20), iconAlignment: IconAlignment.end, ); @@ -463,10 +455,7 @@ class _CreateDynPanelState extends CommonPublishPageState { ); @override - Widget? customPanel(double height) => SizedBox( - height: height, - child: EmotePanel(onChoose: onChooseEmote), - ); + Widget? get customPanel => EmotePanel(onChoose: onChooseEmote); @override Future onCustomPublish({required String message, List? pictures}) async { diff --git a/lib/pages/dynamics_detail/controller.dart b/lib/pages/dynamics_detail/controller.dart index d286c852..fe7f5027 100644 --- a/lib/pages/dynamics_detail/controller.dart +++ b/lib/pages/dynamics_detail/controller.dart @@ -38,7 +38,7 @@ class DynamicDetailController extends ReplyController { } } - getCommentParams(int id) async { + Future getCommentParams(int id) async { var res = await DynamicsHttp.opusDetail(opusId: id); if (res is Success) { final data = (res as Success).response; diff --git a/lib/pages/dynamics_detail/view.dart b/lib/pages/dynamics_detail/view.dart index 3e98d87c..6af4105e 100644 --- a/lib/pages/dynamics_detail/view.dart +++ b/lib/pages/dynamics_detail/view.dart @@ -57,45 +57,46 @@ class _DynamicDetailPageState extends State late final _key = GlobalKey(); - get _getImageCallback => _horizontalPreview - ? (imgList, index) { - _imageStatus = true; - bool isFabVisible = _isFabVisible; - if (isFabVisible) { - _hideFab(); - } - final ctr = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 200), - )..forward(); - PageUtils.onHorizontalPreview( - _key, - AnimationController( - vsync: this, - duration: Duration.zero, - ), - ctr, - imgList, - index, - (value) async { - _imageStatus = null; + Function(dynamic imgList, dynamic index)? get _getImageCallback => + _horizontalPreview + ? (imgList, index) { + _imageStatus = true; + bool isFabVisible = _isFabVisible; if (isFabVisible) { - isFabVisible = false; - _showFab(); + _hideFab(); } - if (value == false) { - await ctr.reverse(); - } - try { - ctr.dispose(); - } catch (_) {} - if (value == false) { - Get.back(); - } - }, - ); - } - : null; + final ctr = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 200), + )..forward(); + PageUtils.onHorizontalPreview( + _key, + AnimationController( + vsync: this, + duration: Duration.zero, + ), + ctr, + imgList, + index, + (value) async { + _imageStatus = null; + if (isFabVisible) { + isFabVisible = false; + _showFab(); + } + if (value == false) { + await ctr.reverse(); + } + try { + ctr.dispose(); + } catch (_) {} + if (value == false) { + Get.back(); + } + }, + ); + } + : null; @override void initState() { @@ -112,7 +113,7 @@ class _DynamicDetailPageState extends State } // 页面初始化 - void init() async { + Future init() async { Map args = Get.arguments; // 楼层 int floor = args['floor']; @@ -310,7 +311,7 @@ class _DynamicDetailPageState extends State builder: (context) => Align( alignment: Alignment.topRight, child: Container( - margin: EdgeInsets.only( + margin: const EdgeInsets.only( top: 56, right: 16, ), @@ -341,7 +342,7 @@ class _DynamicDetailPageState extends State }, icon: Transform.rotate( angle: pi / 2, - child: Icon(Icons.splitscreen, size: 19), + child: const Icon(Icons.splitscreen, size: 19), ), ), const SizedBox(width: 16), @@ -462,7 +463,7 @@ class _DynamicDetailPageState extends State child: SlideTransition( position: Tween( begin: const Offset(0, 1), - end: const Offset(0, 0), + end: Offset.zero, ).animate(CurvedAnimation( parent: _fabAnimationCtr!, curve: Curves.easeInOut, diff --git a/lib/pages/dynamics_repost/view.dart b/lib/pages/dynamics_repost/view.dart index b1f6328c..73d6157f 100644 --- a/lib/pages/dynamics_repost/view.dart +++ b/lib/pages/dynamics_repost/view.dart @@ -133,7 +133,7 @@ class _RepostPanelState extends CommonPublishPageState { theme.colorScheme.surface ? theme.colorScheme.onInverseSurface : theme.colorScheme.surfaceContainerHighest, - borderRadius: BorderRadius.circular(12), + borderRadius: const BorderRadius.all(Radius.circular(12)), ), child: Row( children: [ @@ -224,7 +224,7 @@ class _RepostPanelState extends CommonPublishPageState { const SizedBox(width: 16), Text( widget.rid != null ? '分享至动态' : '转发动态', - style: TextStyle(fontWeight: FontWeight.bold), + style: const TextStyle(fontWeight: FontWeight.bold), ), const Spacer(), TextButton( @@ -232,10 +232,7 @@ class _RepostPanelState extends CommonPublishPageState { style: TextButton.styleFrom( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), child: Text(widget.rid != null ? '立即发布' : '立即转发'), ), @@ -275,7 +272,8 @@ class _RepostPanelState extends CommonPublishPageState { Center( child: Text( widget.rid != null ? '分享至动态' : '转发动态', - style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + style: const TextStyle( + fontSize: 15, fontWeight: FontWeight.bold), ), ), Align( @@ -288,10 +286,7 @@ class _RepostPanelState extends CommonPublishPageState { horizontal: 20, vertical: 10, ), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), child: Text(widget.rid != null ? '发布' : '转发'), ), @@ -343,10 +338,7 @@ class _RepostPanelState extends CommonPublishPageState { ]; @override - Widget? customPanel(double height) => SizedBox( - height: height, - child: EmotePanel(onChoose: onChooseEmote), - ); + Widget? get customPanel => EmotePanel(onChoose: onChooseEmote); @override Future onCustomPublish({required String message, List? pictures}) async { diff --git a/lib/pages/emote/view.dart b/lib/pages/emote/view.dart index 1258c3f6..d838866a 100644 --- a/lib/pages/emote/view.dart +++ b/lib/pages/emote/view.dart @@ -58,7 +58,8 @@ class _EmotePanelState extends State return Material( color: Colors.transparent, child: InkWell( - borderRadius: BorderRadius.circular(8), + borderRadius: + const BorderRadius.all(Radius.circular(8)), onTap: () { widget.onChoose(e.emote![index]); }, @@ -124,7 +125,7 @@ class _EmotePanelState extends State Widget _errorWidget([String? errMsg]) => Center( child: TextButton.icon( onPressed: _emotePanelController.onReload, - icon: Icon(Icons.refresh), + icon: const Icon(Icons.refresh), label: Text(errMsg ?? '没有数据'), ), ); diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index 1e9516a1..5e014cd6 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -28,7 +28,7 @@ import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; enum EpisodeType { part, season, bangumi } extension EpisodeTypeExt on EpisodeType { - String get title => ['分P', '合集', '番剧'][index]; + String get title => const ['分P', '合集', '番剧'][index]; } class EpisodePanel extends CommonSlidePage { @@ -181,16 +181,17 @@ class _EpisodePanelState extends CommonSlidePageState @override void dispose() { - _tabController.removeListener(listener); - _tabController.dispose(); + _tabController + ..removeListener(listener) + ..dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (_isInit) { - return CustomScrollView( - physics: const NeverScrollableScrollPhysics(), + return const CustomScrollView( + physics: NeverScrollableScrollPhysics(), ); } diff --git a/lib/pages/fav/article/controller.dart b/lib/pages/fav/article/controller.dart index 2c0cc2aa..54608d6f 100644 --- a/lib/pages/fav/article/controller.dart +++ b/lib/pages/fav/article/controller.dart @@ -27,7 +27,7 @@ class FavArticleController extends CommonListController { Future customGetData() => UserHttp.favArticle(page: currentPage); - void onRemove(index, id) async { + Future onRemove(index, id) async { final res = await UserHttp.communityAction(opusId: id, action: 4); if (res['status']) { List list = (loadingState.value as Success).response; diff --git a/lib/pages/fav/note/child_view.dart b/lib/pages/fav/note/child_view.dart index 7e55f8ba..a0b114d1 100644 --- a/lib/pages/fav/note/child_view.dart +++ b/lib/pages/fav/note/child_view.dart @@ -50,7 +50,7 @@ class _FavNoteChildPageState extends State child: Obx( () => AnimatedSlide( offset: _favNoteController.enableMultiSelect.value - ? Offset(0, -1) + ? const Offset(0, -1) : Offset.zero, duration: const Duration(milliseconds: 150), child: Container( @@ -91,20 +91,19 @@ class _FavNoteChildPageState extends State _favNoteController.handleSelect( !_favNoteController.allSelected.value); }, - child: Padding( - padding: const EdgeInsets.only( + child: const Padding( + padding: EdgeInsets.only( top: 14, bottom: 14, right: 12, ), - child: const Text('全选'), + child: Text('全选'), ), ), const Spacer(), FilledButton.tonal( style: TextButton.styleFrom( - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, tapTargetSize: MaterialTapTargetSize.shrinkWrap, ), onPressed: () { diff --git a/lib/pages/fav/note/controller.dart b/lib/pages/fav/note/controller.dart index a4be72ed..fc07b741 100644 --- a/lib/pages/fav/note/controller.dart +++ b/lib/pages/fav/note/controller.dart @@ -17,7 +17,7 @@ class FavNoteController } @override - onSelect(int index, [bool disableSelect = true]) { + void onSelect(int index, [bool disableSelect = true]) { super.onSelect(index, false); } @@ -34,7 +34,7 @@ class FavNoteController : VideoHttp.noteList(page: currentPage); } - void onRemove() async { + Future onRemove() async { List dataList = (loadingState.value as Success).response; Set removeList = dataList.where((item) => item.checked == true).toSet(); diff --git a/lib/pages/fav/note/view.dart b/lib/pages/fav/note/view.dart index 93d28fed..b053e4b5 100644 --- a/lib/pages/fav/note/view.dart +++ b/lib/pages/fav/note/view.dart @@ -45,7 +45,7 @@ class _FavNotePageState extends State const EdgeInsets.symmetric(horizontal: 3, vertical: 8), indicator: BoxDecoration( color: theme.colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(20), + borderRadius: const BorderRadius.all(Radius.circular(20)), ), indicatorSize: TabBarIndicatorSize.tab, labelStyle: TabBarTheme.of(context) @@ -55,15 +55,15 @@ class _FavNotePageState extends State labelColor: theme.colorScheme.onSecondaryContainer, unselectedLabelColor: theme.colorScheme.outline, tabs: [ - Tab(text: '未发布笔记'), - Tab(text: '公开笔记'), + const Tab(text: '未发布笔记'), + const Tab(text: '公开笔记'), ], ), ), // TextButton( // style: TextButton.styleFrom( // foregroundColor: theme.colorScheme.onSurfaceVariant, - // visualDensity: VisualDensity(horizontal: -2, vertical: -2), + // visualDensity: const VisualDensity(horizontal: -2, vertical: -2), // tapTargetSize: MaterialTapTargetSize.shrinkWrap, // ), // onPressed: () async { @@ -91,8 +91,8 @@ class _FavNotePageState extends State controller: _tabController, physics: const NeverScrollableScrollPhysics(), children: [ - FavNoteChildPage(isPublish: false), - FavNoteChildPage(isPublish: true), + const FavNoteChildPage(isPublish: false), + const FavNoteChildPage(isPublish: true), ], ), ), diff --git a/lib/pages/fav/note/widget/item.dart b/lib/pages/fav/note/widget/item.dart index aec5e45d..e4f763fa 100644 --- a/lib/pages/fav/note/widget/item.dart +++ b/lib/pages/fav/note/widget/item.dart @@ -60,7 +60,7 @@ class FavNoteItem extends StatelessWidget { item.title ?? '', maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle( + style: const TextStyle( height: 1.4, fontSize: 14, fontWeight: FontWeight.bold, diff --git a/lib/pages/fav/pgc/child_view.dart b/lib/pages/fav/pgc/child_view.dart index 47797627..0296df79 100644 --- a/lib/pages/fav/pgc/child_view.dart +++ b/lib/pages/fav/pgc/child_view.dart @@ -57,7 +57,7 @@ class _FavPgcChildPageState extends State child: Obx( () => AnimatedSlide( offset: _favPgcController.enableMultiSelect.value - ? Offset(0, -1) + ? const Offset(0, -1) : Offset.zero, duration: const Duration(milliseconds: 150), child: Container( @@ -98,13 +98,13 @@ class _FavPgcChildPageState extends State _favPgcController.handleSelect( !_favPgcController.allSelected.value); }, - child: Padding( - padding: const EdgeInsets.only( + child: const Padding( + padding: EdgeInsets.only( top: 14, bottom: 14, right: 12, ), - child: const Text('全选'), + child: Text('全选'), ), ), const Spacer(), diff --git a/lib/pages/fav/pgc/controller.dart b/lib/pages/fav/pgc/controller.dart index 51f72467..5d555234 100644 --- a/lib/pages/fav/pgc/controller.dart +++ b/lib/pages/fav/pgc/controller.dart @@ -22,7 +22,7 @@ class FavPgcController } @override - onSelect(int index, [bool disableSelect = true]) { + void onSelect(int index, [bool disableSelect = true]) { super.onSelect(index, false); } diff --git a/lib/pages/fav/pgc/view.dart b/lib/pages/fav/pgc/view.dart index b515d8a1..5b12e9fc 100644 --- a/lib/pages/fav/pgc/view.dart +++ b/lib/pages/fav/pgc/view.dart @@ -47,7 +47,7 @@ class _FavPgcPageState extends State const EdgeInsets.symmetric(horizontal: 3, vertical: 8), indicator: BoxDecoration( color: theme.colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(20), + borderRadius: const BorderRadius.all(Radius.circular(20)), ), indicatorSize: TabBarIndicatorSize.tab, labelStyle: TabBarTheme.of(context) @@ -66,7 +66,8 @@ class _FavPgcPageState extends State // TextButton( // style: TextButton.styleFrom( // foregroundColor: theme.colorScheme.onSurfaceVariant, - // visualDensity: VisualDensity(horizontal: -2, vertical: -2), + // visualDensity: + // const VisualDensity(horizontal: -2, vertical: -2), // tapTargetSize: MaterialTapTargetSize.shrinkWrap, // ), // onPressed: () {}, diff --git a/lib/pages/fav/pgc/widget/item.dart b/lib/pages/fav/pgc/widget/item.dart index b00cf32c..ba57eaa4 100644 --- a/lib/pages/fav/pgc/widget/item.dart +++ b/lib/pages/fav/pgc/widget/item.dart @@ -89,7 +89,8 @@ class FavPgcItem extends StatelessWidget { width: constraints.maxHeight * StyleString.aspectRatio, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), + borderRadius: const BorderRadius.all( + Radius.circular(4)), color: Colors.black.withOpacity(0.6), ), child: SizedBox( diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index 7db06c8c..be7c692a 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -55,8 +55,9 @@ class _FavPageState extends State with SingleTickerProviderStateMixin { @override void dispose() { - _tabController.removeListener(listener); - _tabController.dispose(); + _tabController + ..removeListener(listener) + ..dispose(); super.dispose(); } diff --git a/lib/pages/fav_create/view.dart b/lib/pages/fav_create/view.dart index 77a13b4d..c74b6b3e 100644 --- a/lib/pages/fav_create/view.dart +++ b/lib/pages/fav_create/view.dart @@ -108,12 +108,12 @@ class _CreateFavPageState extends State { ], ), ) - : Center(child: CircularProgressIndicator()) + : const Center(child: CircularProgressIndicator()) : _buildBody(theme), ); } - void _pickImg(ThemeData theme) async { + Future _pickImg(ThemeData theme) async { try { XFile? pickedFile = await _imagePicker.pickImage( source: ImageSource.gallery, @@ -165,7 +165,7 @@ class _CreateFavPageState extends State { } } - dynamic leadingStyle = TextStyle(fontSize: 14); + final leadingStyle = const TextStyle(fontSize: 14); Widget _buildBody(ThemeData theme) => SingleChildScrollView( child: Column( @@ -234,7 +234,8 @@ class _CreateFavPageState extends State { child: LayoutBuilder( builder: (context, constraints) { return ClipRRect( - borderRadius: BorderRadius.circular(6), + borderRadius: + const BorderRadius.all(Radius.circular(6)), child: CachedNetworkImage( imageUrl: Utils.thumbnailImgUrl(_cover!), height: constraints.maxHeight, @@ -258,7 +259,7 @@ class _CreateFavPageState extends State { ListTile( tileColor: theme.colorScheme.onInverseSurface, leading: Text.rich( - style: TextStyle( + style: const TextStyle( height: 1, fontSize: 14, ), @@ -272,7 +273,7 @@ class _CreateFavPageState extends State { color: theme.colorScheme.error, ), ), - TextSpan( + const TextSpan( text: '名称', style: TextStyle( height: 1, @@ -302,11 +303,11 @@ class _CreateFavPageState extends State { fontSize: 14, color: theme.colorScheme.outline, ), - border: OutlineInputBorder( + border: const OutlineInputBorder( borderSide: BorderSide.none, gapPadding: 0, ), - contentPadding: EdgeInsets.all(0), + contentPadding: EdgeInsets.zero, ), ), ), @@ -327,7 +328,7 @@ class _CreateFavPageState extends State { color: theme.colorScheme.onSurfaceVariant, ), ), - TextSpan( + const TextSpan( text: '*', style: TextStyle(color: Colors.transparent), ) @@ -340,7 +341,7 @@ class _CreateFavPageState extends State { minLines: 6, maxLines: 6, controller: _introController, - style: TextStyle(fontSize: 14), + style: const TextStyle(fontSize: 14), inputFormatters: [ LengthLimitingTextInputFormatter(200), ], @@ -351,11 +352,11 @@ class _CreateFavPageState extends State { fontSize: 14, color: theme.colorScheme.outline, ), - border: OutlineInputBorder( + border: const OutlineInputBorder( borderSide: BorderSide.none, gapPadding: 0, ), - contentPadding: EdgeInsets.all(0), + contentPadding: EdgeInsets.zero, ), ), ), diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index 50813f88..a80bcfcf 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -59,7 +59,7 @@ class FavDetailController return false; } - onCancelFav(int index, int id, int type) async { + Future onCancelFav(int index, int id, int type) async { var result = await VideoHttp.delFav( ids: ['$id:$type'], delIds: mediaId.toString(), @@ -85,7 +85,7 @@ class FavDetailController mediaId: mediaId, ); - onDelChecked(BuildContext context) { + void onDelChecked(BuildContext context) { showDialog( context: context, builder: (context) { diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index d42e0992..a0c3cf3c 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -122,8 +122,7 @@ class _FavDetailPageState extends State { ? [ TextButton( style: TextButton.styleFrom( - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () => _favDetailController.handleSelect(true), @@ -131,8 +130,7 @@ class _FavDetailPageState extends State { ), TextButton( style: TextButton.styleFrom( - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () { RequestUtils.onCopyOrMove { ), TextButton( style: TextButton.styleFrom( - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () { RequestUtils.onCopyOrMove { ), TextButton( style: TextButton.styleFrom( - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () => _favDetailController.onDelChecked(context), @@ -222,7 +218,7 @@ class _FavDetailPageState extends State { } }); }, - child: Text('编辑信息'), + child: const Text('编辑信息'), ), PopupMenuItem( onTap: () { @@ -242,7 +238,7 @@ class _FavDetailPageState extends State { } }); }, - child: Text('清除失效内容'), + child: const Text('清除失效内容'), ), PopupMenuItem( onTap: () { @@ -271,7 +267,7 @@ class _FavDetailPageState extends State { ); } }, - child: Text('排序'), + child: const Text('排序'), ), if (!Utils.isDefaultFav( _favDetailController diff --git a/lib/pages/fav_folder_sort/view.dart b/lib/pages/fav_folder_sort/view.dart index d7239141..4d27d4cc 100644 --- a/lib/pages/fav_folder_sort/view.dart +++ b/lib/pages/fav_folder_sort/view.dart @@ -57,8 +57,9 @@ class _FavFolderSortPageState extends State { @override void dispose() { - _scrollController.removeListener(listener); - _scrollController.dispose(); + _scrollController + ..removeListener(listener) + ..dispose(); super.dispose(); } @@ -66,7 +67,7 @@ class _FavFolderSortPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('收藏夹排序'), + title: const Text('收藏夹排序'), actions: [ TextButton( onPressed: () async { diff --git a/lib/pages/fav_panel/view.dart b/lib/pages/fav_panel/view.dart index 8546ba9f..d742082b 100644 --- a/lib/pages/fav_panel/view.dart +++ b/lib/pages/fav_panel/view.dart @@ -68,10 +68,7 @@ class _FavPanelState extends State { style: TextButton.styleFrom( padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 14), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), ), const SizedBox(width: 16), diff --git a/lib/pages/fav_search/controller.dart b/lib/pages/fav_search/controller.dart index ea67bffe..9ba0b546 100644 --- a/lib/pages/fav_search/controller.dart +++ b/lib/pages/fav_search/controller.dart @@ -37,7 +37,7 @@ class FavSearchController return false; } - onCancelFav(int index, int id, int? type) async { + Future onCancelFav(int index, int id, int? type) async { var result = await VideoHttp.favVideo( aid: id, addIds: '', diff --git a/lib/pages/fav_search/view.dart b/lib/pages/fav_search/view.dart index f5d52758..24dbeb4e 100644 --- a/lib/pages/fav_search/view.dart +++ b/lib/pages/fav_search/view.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/fav_search/controller.dart'; class FavSearchPage extends CommonSearchPage { const FavSearchPage({super.key}); diff --git a/lib/pages/fav_sort/view.dart b/lib/pages/fav_sort/view.dart index 1dd76c00..0d064351 100644 --- a/lib/pages/fav_sort/view.dart +++ b/lib/pages/fav_sort/view.dart @@ -58,8 +58,9 @@ class _FavSortPageState extends State { @override void dispose() { - _scrollController.removeListener(listener); - _scrollController.dispose(); + _scrollController + ..removeListener(listener) + ..dispose(); super.dispose(); } diff --git a/lib/pages/follow/child_view.dart b/lib/pages/follow/child_view.dart index 8a29aa7f..fe2f920b 100644 --- a/lib/pages/follow/child_view.dart +++ b/lib/pages/follow/child_view.dart @@ -82,7 +82,7 @@ class _FollowChildPageState extends State Loading() => SliverList.builder( itemCount: 12, itemBuilder: (context, index) { - return MsgFeedTopSkeleton(); + return const MsgFeedTopSkeleton(); }, ), Success() => loadingState.response?.isNotEmpty == true diff --git a/lib/pages/follow/controller.dart b/lib/pages/follow/controller.dart index 48123ffe..fcc3704b 100644 --- a/lib/pages/follow/controller.dart +++ b/lib/pages/follow/controller.dart @@ -33,9 +33,10 @@ class FollowController extends GetxController with GetTickerProviderStateMixin { Future queryFollowUpTags() async { var res = await MemberHttp.followUpTags(); if (res['status']) { - tabs.clear(); - tabs.addAll(res['data']); - tabs.insert(0, MemberTagItemModel(name: '全部关注')); + tabs + ..clear() + ..addAll(res['data']) + ..insert(0, MemberTagItemModel(name: '全部关注')); int initialIndex = 0; if (tabController != null) { initialIndex = tabController!.index.clamp(0, tabs.length - 1); diff --git a/lib/pages/follow/view.dart b/lib/pages/follow/view.dart index 83be6716..30a82e5b 100644 --- a/lib/pages/follow/view.dart +++ b/lib/pages/follow/view.dart @@ -8,7 +8,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/follow/controller.dart'; class FollowPage extends StatefulWidget { const FollowPage({super.key}); @@ -106,7 +106,7 @@ class _FollowPageState extends State { Text( '${item.name}${count != null ? '($count)' : ''} ', ), - Icon(Icons.menu, size: 18), + const Icon(Icons.menu, size: 18), ], ), ), diff --git a/lib/pages/follow/widgets/follow_item.dart b/lib/pages/follow/widgets/follow_item.dart index 2eb4b8c6..a41b6a40 100644 --- a/lib/pages/follow/widgets/follow_item.dart +++ b/lib/pages/follow/widgets/follow_item.dart @@ -58,7 +58,7 @@ class FollowItem extends StatelessWidget { Positioned( bottom: 0, right: 0, - child: Container( + child: DecoratedBox( decoration: BoxDecoration( shape: BoxShape.circle, color: theme.colorScheme.surface, @@ -108,7 +108,7 @@ class FollowItem extends StatelessWidget { ), child: Text( '${item.attribute == -1 ? '' : '已'}关注', - style: TextStyle(fontSize: 12), + style: const TextStyle(fontSize: 12), ), ), ) diff --git a/lib/pages/follow_search/view.dart b/lib/pages/follow_search/view.dart index 70fc202c..d2f43d0b 100644 --- a/lib/pages/follow_search/view.dart +++ b/lib/pages/follow_search/view.dart @@ -5,7 +5,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/follow_search/controller.dart'; class FollowSearchPage extends CommonSearchPage { const FollowSearchPage({super.key, this.mid}); diff --git a/lib/pages/group_panel/view.dart b/lib/pages/group_panel/view.dart index 6ef00c88..59e9ed59 100644 --- a/lib/pages/group_panel/view.dart +++ b/lib/pages/group_panel/view.dart @@ -45,7 +45,7 @@ class _GroupPanelState extends State { }(); } - void onSave() async { + Future onSave() async { feedBack(); // 是否有选中的 有选中的带id,没选使用默认0 final bool anyHasChecked = diff --git a/lib/pages/history/controller.dart b/lib/pages/history/controller.dart index e96fe2c3..9ba4a2a4 100644 --- a/lib/pages/history/controller.dart +++ b/lib/pages/history/controller.dart @@ -37,7 +37,7 @@ class HistoryController extends MultiSelectController } @override - onSelect(int index, [bool disableSelect = true]) { + void onSelect(int index, [bool disableSelect = true]) { List list = (loadingState.value as Success).response; list[index].checked = !(list[index].checked ?? false); baseCtr.checkedCount.value = @@ -121,7 +121,7 @@ class HistoryController extends MultiSelectController } } - void _onDelete(List result) async { + Future _onDelete(List result) async { SmartDialog.showLoading(msg: '请求中'); List kidList = result.map((item) { return '${item.history.business}_${item.kid}'; diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index d8604d0e..03fdddf4 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -199,7 +199,7 @@ class _HistoryPageState extends State } }, tabs: [ - Tab(text: '全部'), + const Tab(text: '全部'), ..._historyController.tabs.map( (item) => Tab(text: item.name), ), diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index 3190f10d..c4786f5c 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -265,10 +265,10 @@ class HistoryItem extends StatelessWidget { child: Row( children: [ Icon(MdiIcons.accountCircleOutline, size: 16), - SizedBox(width: 6), + const SizedBox(width: 6), Text( '访问:${videoItem.authorName}', - style: TextStyle(fontSize: 13), + style: const TextStyle(fontSize: 13), ) ], ), diff --git a/lib/pages/history_search/view.dart b/lib/pages/history_search/view.dart index 0c2df6e9..5c42d3b8 100644 --- a/lib/pages/history_search/view.dart +++ b/lib/pages/history_search/view.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/history_search/controller.dart'; class HistorySearchPage extends CommonSearchPage { const HistorySearchPage({super.key}); diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart index 281ee688..7566491b 100644 --- a/lib/pages/home/controller.dart +++ b/lib/pages/home/controller.dart @@ -72,14 +72,15 @@ class HomeController extends GetxController return controller.onRefresh().catchError((e) => debugPrint(e.toString())); } - void setTabConfig() async { + Future setTabConfig() async { final defaultTabs = [...tabsConfig]; final tabbarSort = GStorage.tabbarSort; - defaultTabs.retainWhere( - (item) => tabbarSort.contains((item['type'] as TabType).name)); - defaultTabs.sort((a, b) => tabbarSort - .indexOf((a['type'] as TabType).name) - .compareTo(tabbarSort.indexOf((b['type'] as TabType).name))); + defaultTabs + ..retainWhere( + (item) => tabbarSort.contains((item['type'] as TabType).name)) + ..sort((a, b) => tabbarSort + .indexOf((a['type'] as TabType).name) + .compareTo(tabbarSort.indexOf((b['type'] as TabType).name))); tabs = defaultTabs; @@ -98,7 +99,7 @@ class HomeController extends GetxController super.dispose(); } - void querySearchDefault() async { + Future querySearchDefault() async { try { var res = await Request().get(Api.searchDefault); if (res.data['code'] == 0) { @@ -107,7 +108,7 @@ class HomeController extends GetxController } catch (_) {} } - showUserInfoDialog(context) { + void showUserInfoDialog(context) { feedBack(); showDialog( context: context, diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index fad2e5e7..6373e3c8 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -8,7 +8,7 @@ import 'package:get/get.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -import './controller.dart'; +import 'package:PiliPlus/pages/home/controller.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:stream_transform/stream_transform.dart'; @@ -182,8 +182,8 @@ class _HomePageState extends State child: Container( height: 44, clipBehavior: Clip.hardEdge, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(25)), ), child: Material( color: theme.colorScheme.onSecondaryContainer.withOpacity(0.05), @@ -265,8 +265,8 @@ Widget msgBadge(MainController mainController) { isLabelVisible: mainController.msgBadgeMode != DynamicBadgeMode.hidden && mainController.msgUnReadCount.value.isNotEmpty, alignment: mainController.msgBadgeMode == DynamicBadgeMode.number - ? Alignment(0, -0.5) - : Alignment(0.5, -0.5), + ? const Alignment(0, -0.5) + : const Alignment(0.5, -0.5), label: mainController.msgBadgeMode == DynamicBadgeMode.number && mainController.msgUnReadCount.value.isNotEmpty ? Text(mainController.msgUnReadCount.value.toString()) diff --git a/lib/pages/hot/view.dart b/lib/pages/hot/view.dart index 188820f9..377bad9a 100644 --- a/lib/pages/hot/view.dart +++ b/lib/pages/hot/view.dart @@ -47,7 +47,7 @@ class _HotPageState extends CommonPageState const SizedBox(height: 4), Text( title, - style: TextStyle(fontSize: 12), + style: const TextStyle(fontSize: 12), ), ], ), @@ -91,7 +91,7 @@ class _HotPageState extends CommonPageState Get.to( Scaffold( appBar: AppBar(title: const Text('排行榜')), - body: SafeArea( + body: const SafeArea( top: false, bottom: false, child: RankPage(), diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index 7783662e..881c3d64 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -31,7 +31,7 @@ class LaterController extends MultiSelectController { ); @override - onSelect(int index, [bool disableSelect = true]) { + void onSelect(int index, [bool disableSelect = true]) { List list = (loadingState.value as Success).response; list[index].checked = !(list[index].checked ?? false); baseCtr.checkedCount.value = @@ -91,7 +91,7 @@ class LaterController extends MultiSelectController { builder: (context) { return AlertDialog( title: const Text('提示'), - content: Text('即将移除该视频,确定是否移除'), + content: const Text('即将移除该视频,确定是否移除'), actions: [ TextButton( onPressed: Get.back, @@ -114,7 +114,7 @@ class LaterController extends MultiSelectController { } SmartDialog.showToast(res['msg']); }, - child: Text('确认移除'), + child: const Text('确认移除'), ) ], ); @@ -150,7 +150,7 @@ class LaterController extends MultiSelectController { ); } - onDelChecked(BuildContext context) { + void onDelChecked(BuildContext context) { showDialog( context: context, builder: (context) { @@ -183,7 +183,7 @@ class LaterController extends MultiSelectController { ); } - void _onDelete(List result) async { + Future _onDelete(List result) async { SmartDialog.showLoading(msg: '请求中'); List aids = result.map((item) => item.aid).toList(); dynamic res = await UserHttp.toViewDel(aids: aids); diff --git a/lib/pages/later/view.dart b/lib/pages/later/view.dart index 8b428cb7..8def8d94 100644 --- a/lib/pages/later/view.dart +++ b/lib/pages/later/view.dart @@ -17,7 +17,7 @@ enum LaterViewType { all, toView, unfinished, viewed } extension LaterViewTypeExt on LaterViewType { int get type => index; - String get title => ['全部', '未看', '未看完', '已看完'][index]; + String get title => const ['全部', '未看', '未看完', '已看完'][index]; Widget get page => LaterViewChildPage(laterViewType: this); } @@ -58,8 +58,9 @@ class _LaterPageState extends State @override void dispose() { - _tabController.removeListener(listener); - _tabController.dispose(); + _tabController + ..removeListener(listener) + ..dispose(); Get.delete(); super.dispose(); } @@ -156,7 +157,7 @@ class _LaterPageState extends State ), Material( clipBehavior: Clip.hardEdge, - borderRadius: BorderRadius.circular(20), + borderRadius: const BorderRadius.all(Radius.circular(20)), child: Builder( key: sortKey, builder: (context) { @@ -191,13 +192,13 @@ class _LaterPageState extends State ), ), itemBuilder: (BuildContext context) => [ - PopupMenuItem( + const PopupMenuItem( value: false, - child: const Text('最近添加'), + child: Text('最近添加'), ), - PopupMenuItem( + const PopupMenuItem( value: true, - child: const Text('最早添加'), + child: Text('最早添加'), ), ], ); @@ -206,7 +207,7 @@ class _LaterPageState extends State ), Material( clipBehavior: Clip.hardEdge, - borderRadius: BorderRadius.circular(20), + borderRadius: const BorderRadius.all(Radius.circular(20)), child: PopupMenuButton( tooltip: '清空', child: Padding( @@ -215,7 +216,7 @@ class _LaterPageState extends State child: Text.rich( TextSpan( children: [ - TextSpan( + const TextSpan( text: '清空', ), WidgetSpan( @@ -263,14 +264,14 @@ class _LaterPageState extends State actions: [ TextButton( style: TextButton.styleFrom( - visualDensity: VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () => currCtr().handleSelect(true), child: const Text('全选'), ), TextButton( style: TextButton.styleFrom( - visualDensity: VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () { final ctr = currCtr(); @@ -291,7 +292,7 @@ class _LaterPageState extends State ), TextButton( style: TextButton.styleFrom( - visualDensity: VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () { final ctr = currCtr(); @@ -312,7 +313,7 @@ class _LaterPageState extends State ), TextButton( style: TextButton.styleFrom( - visualDensity: VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () => currCtr().onDelChecked(context), child: Text( diff --git a/lib/pages/later_search/view.dart b/lib/pages/later_search/view.dart index 2c48521f..9a169733 100644 --- a/lib/pages/later_search/view.dart +++ b/lib/pages/later_search/view.dart @@ -8,7 +8,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/later_search/controller.dart'; class LaterSearchPage extends CommonSearchPage { const LaterSearchPage({super.key}); diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index 1e1438b0..a881e58e 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -38,7 +38,7 @@ class _LivePageState extends CommonPageState clipBehavior: Clip.hardEdge, margin: const EdgeInsets.only( left: StyleString.safeSpace, right: StyleString.safeSpace), - decoration: BoxDecoration( + decoration: const BoxDecoration( borderRadius: StyleString.mdRadius, ), child: refreshIndicator( @@ -52,7 +52,7 @@ class _LivePageState extends CommonPageState Obx( () => controller.isLogin.value ? SliverPadding( - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( vertical: StyleString.cardSpace, ), sliver: SliverToBoxAdapter( @@ -130,7 +130,7 @@ class _LivePageState extends CommonPageState () => Text.rich( TextSpan( children: [ - TextSpan(text: '我的关注 '), + const TextSpan(text: '我的关注 '), TextSpan( text: '${controller.liveCount.value}', style: TextStyle( @@ -240,7 +240,7 @@ class _LivePageState extends CommonPageState loadingState.response[index].uname, maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 12), + style: const TextStyle(fontSize: 12), textAlign: TextAlign.center, ), ], diff --git a/lib/pages/live/widgets/live_item.dart b/lib/pages/live/widgets/live_item.dart index bf5c15b2..29646141 100644 --- a/lib/pages/live/widgets/live_item.dart +++ b/lib/pages/live/widgets/live_item.dart @@ -31,38 +31,35 @@ class LiveCardV extends StatelessWidget { ), child: Column( children: [ - ClipRRect( - borderRadius: StyleString.mdRadius, - child: AspectRatio( - aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder(builder: (context, boxConstraints) { - double maxWidth = boxConstraints.maxWidth; - double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - Hero( - tag: heroTag, - child: NetworkImgLayer( - src: liveItem.cover!, - width: maxWidth, - height: maxHeight, - ), + AspectRatio( + aspectRatio: StyleString.aspectRatio, + child: LayoutBuilder(builder: (context, boxConstraints) { + double maxWidth = boxConstraints.maxWidth; + double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + Hero( + tag: heroTag, + child: NetworkImgLayer( + src: liveItem.cover!, + width: maxWidth, + height: maxHeight, ), - Positioned( - left: 0, - right: 0, - bottom: 0, - child: AnimatedOpacity( - opacity: 1, - duration: const Duration(milliseconds: 200), - child: videoStat(context), - ), + ), + Positioned( + left: 0, + right: 0, + bottom: 0, + child: AnimatedOpacity( + opacity: 1, + duration: const Duration(milliseconds: 200), + child: videoStat(context), ), - ], - ); - }), - ), + ), + ], + ); + }), ), liveContent(context) ], diff --git a/lib/pages/live/widgets/live_item_follow.dart b/lib/pages/live/widgets/live_item_follow.dart index f6653bc2..ca29c874 100644 --- a/lib/pages/live/widgets/live_item_follow.dart +++ b/lib/pages/live/widgets/live_item_follow.dart @@ -31,38 +31,35 @@ class LiveCardVFollow extends StatelessWidget { ), child: Column( children: [ - ClipRRect( - borderRadius: StyleString.mdRadius, - child: AspectRatio( - aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder(builder: (context, boxConstraints) { - double maxWidth = boxConstraints.maxWidth; - double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - Hero( - tag: heroTag, - child: NetworkImgLayer( - src: liveItem.roomCover!, - width: maxWidth, - height: maxHeight, - ), + AspectRatio( + aspectRatio: StyleString.aspectRatio, + child: LayoutBuilder(builder: (context, boxConstraints) { + double maxWidth = boxConstraints.maxWidth; + double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + Hero( + tag: heroTag, + child: NetworkImgLayer( + src: liveItem.roomCover!, + width: maxWidth, + height: maxHeight, ), - Positioned( - left: 0, - right: 0, - bottom: 0, - child: AnimatedOpacity( - opacity: 1, - duration: const Duration(milliseconds: 200), - child: videoStat(context), - ), + ), + Positioned( + left: 0, + right: 0, + bottom: 0, + child: AnimatedOpacity( + opacity: 1, + duration: const Duration(milliseconds: 200), + child: videoStat(context), ), - ], - ); - }), - ), + ), + ], + ); + }), ), liveContent(context) ], diff --git a/lib/pages/live_emote/view.dart b/lib/pages/live_emote/view.dart index af17e439..00f55b1f 100644 --- a/lib/pages/live_emote/view.dart +++ b/lib/pages/live_emote/view.dart @@ -75,7 +75,8 @@ class _LiveEmotePanelState extends State return Material( color: Colors.transparent, child: InkWell( - borderRadius: BorderRadius.circular(8), + borderRadius: + const BorderRadius.all(Radius.circular(8)), onTap: () { if (item.pkgType == 3) { widget.onChoose(item.emoticons![index]); @@ -139,7 +140,7 @@ class _LiveEmotePanelState extends State Widget _errorWidget([String? errMsg]) => Center( child: TextButton.icon( onPressed: _emotePanelController.onReload, - icon: Icon(Icons.refresh), + icon: const Icon(Icons.refresh), label: Text(errMsg ?? '没有数据'), ), ); diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 10cdd460..d395e586 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -57,7 +57,7 @@ class LiveRoomController extends GetxController { } } - playerInit(source) async { + Future playerInit(source) async { await plPlayerController.setDataSource( DataSource( videoSource: source, @@ -69,8 +69,6 @@ class LiveRoomController extends GetxController { 'referer': HttpString.baseUrl }, ), - // 硬解 - enableHA: true, autoplay: true, direction: isPortrait.value ? 'vertical' : 'horizontal', ); @@ -230,13 +228,14 @@ class LiveRoomController extends GetxController { @override void onClose() { - scrollController.removeListener(listener); - scrollController.dispose(); + scrollController + ..removeListener(listener) + ..dispose(); super.onClose(); } // 修改画质 - void changeQn(int qn) async { + Future changeQn(int qn) async { if (currentQn == qn) { return; } diff --git a/lib/pages/live_room/send_danmaku/view.dart b/lib/pages/live_room/send_danmaku/view.dart index f287b735..0902ee53 100644 --- a/lib/pages/live_room/send_danmaku/view.dart +++ b/lib/pages/live_room/send_danmaku/view.dart @@ -49,167 +49,141 @@ class _ReplyPageState extends CommonPublishPageState { @override Widget build(BuildContext context) { final theme = Theme.of(context); - return MediaQuery.removePadding( - removeTop: true, - context: context, - child: GestureDetector( - onTap: Get.back, - child: LayoutBuilder( - builder: (context, constraints) { - bool isH = constraints.maxWidth > constraints.maxHeight; - late double padding = constraints.maxWidth * 0.12; - return Padding( - padding: EdgeInsets.symmetric(horizontal: isH ? padding : 0), - child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: Colors.transparent, - body: GestureDetector( - onTap: () {}, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - buildInputView(theme), - buildPanelContainer(theme.colorScheme.surface), - ], - ), - ), - ), - ); - }, + return SafeArea( + bottom: false, + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + constraints: const BoxConstraints(maxWidth: 640), + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + ), + color: theme.colorScheme.surface, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ...buildInputView(theme), + buildPanelContainer(Colors.transparent), + ], + ), ), ), ); } @override - Widget? customPanel(double height) => SizedBox( - height: height, - child: LiveEmotePanel( - onChoose: onChooseEmote, - roomId: liveRoomController.roomId, - onSendEmoticonUnique: (emote) { - onCustomPublish( - message: emote.emoticonUnique!, - dmType: 1, - emoticonOptions: '[object Object]', - emoticonUnique: emote.emoji, - ); - }, - ), + Widget? get customPanel => LiveEmotePanel( + onChoose: onChooseEmote, + roomId: liveRoomController.roomId, + onSendEmoticonUnique: (emote) { + onCustomPublish( + message: emote.emoticonUnique!, + dmType: 1, + emoticonOptions: '[object Object]', + emoticonUnique: emote.emoji, + ); + }, ); - Widget buildInputView(ThemeData theme) { - return Container( - clipBehavior: Clip.hardEdge, - margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top), - decoration: BoxDecoration( - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(12), - topRight: Radius.circular(12), - ), - color: theme.colorScheme.surface, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: - const EdgeInsets.only(top: 12, right: 15, left: 15, bottom: 10), - child: Form( - autovalidateMode: AutovalidateMode.onUserInteraction, - child: Listener( - onPointerUp: (event) { - if (readOnly.value) { - updatePanelType(PanelType.keyboard); - selectKeyboard.value = true; + List buildInputView(ThemeData theme) { + return [ + Container( + padding: + const EdgeInsets.only(top: 12, right: 15, left: 15, bottom: 10), + child: Form( + autovalidateMode: AutovalidateMode.onUserInteraction, + child: Listener( + onPointerUp: (event) { + if (readOnly.value) { + updatePanelType(PanelType.keyboard); + selectKeyboard.value = true; + } + }, + child: Obx( + () => TextField( + controller: editController, + minLines: 1, + maxLines: 2, + autofocus: false, + readOnly: readOnly.value, + onChanged: (value) { + bool isEmpty = value.trim().isEmpty; + if (!isEmpty && !enablePublish.value) { + enablePublish.value = true; + } else if (isEmpty && enablePublish.value) { + enablePublish.value = false; } + liveRoomController.savedDanmaku = value; }, - child: Obx( - () => TextField( - controller: editController, - minLines: 1, - maxLines: 2, - autofocus: false, - readOnly: readOnly.value, - onChanged: (value) { - bool isEmpty = value.trim().isEmpty; - if (!isEmpty && !enablePublish.value) { - enablePublish.value = true; - } else if (isEmpty && enablePublish.value) { - enablePublish.value = false; - } - liveRoomController.savedDanmaku = value; - }, - focusNode: focusNode, - decoration: InputDecoration( - hintText: "输入弹幕内容", - border: InputBorder.none, - hintStyle: TextStyle(fontSize: 14)), - style: theme.textTheme.bodyLarge, - inputFormatters: [LengthLimitingTextInputFormatter(20)], - ), + focusNode: focusNode, + decoration: const InputDecoration( + hintText: "输入弹幕内容", + border: InputBorder.none, + hintStyle: TextStyle(fontSize: 14), ), + style: theme.textTheme.bodyLarge, + inputFormatters: [LengthLimitingTextInputFormatter(20)], ), ), ), - Divider( - height: 1, - color: theme.dividerColor.withOpacity(0.1), - ), - Container( - height: 52, - padding: const EdgeInsets.only(left: 12, right: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Obx( - () => ToolbarIconButton( - tooltip: '输入', - onPressed: () { - if (!selectKeyboard.value) { - selectKeyboard.value = true; - updatePanelType(PanelType.keyboard); - } - }, - icon: const Icon(Icons.keyboard, size: 22), - selected: selectKeyboard.value, - ), - ), - const SizedBox(width: 10), - Obx( - () => ToolbarIconButton( - tooltip: '表情', - onPressed: () { - if (selectKeyboard.value) { - selectKeyboard.value = false; - updatePanelType(PanelType.emoji); - } - }, - icon: const Icon(Icons.emoji_emotions, size: 22), - selected: !selectKeyboard.value, - ), - ), - const Spacer(), - Obx( - () => FilledButton.tonal( - onPressed: enablePublish.value ? onPublish : null, - style: FilledButton.styleFrom( - padding: const EdgeInsets.symmetric( - horizontal: 20, vertical: 10), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), - ), - child: const Text('发送'), - ), - ), - ], - ), - ), - ], + ), ), - ); + Divider( + height: 1, + color: theme.dividerColor.withOpacity(0.1), + ), + Container( + height: 52, + padding: const EdgeInsets.only(left: 12, right: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Obx( + () => ToolbarIconButton( + tooltip: '输入', + onPressed: () { + if (!selectKeyboard.value) { + selectKeyboard.value = true; + updatePanelType(PanelType.keyboard); + } + }, + icon: const Icon(Icons.keyboard, size: 22), + selected: selectKeyboard.value, + ), + ), + const SizedBox(width: 10), + Obx( + () => ToolbarIconButton( + tooltip: '表情', + onPressed: () { + if (selectKeyboard.value) { + selectKeyboard.value = false; + updatePanelType(PanelType.emoji); + } + }, + icon: const Icon(Icons.emoji_emotions, size: 22), + selected: !selectKeyboard.value, + ), + ), + const Spacer(), + Obx( + () => FilledButton.tonal( + onPressed: enablePublish.value ? onPublish : null, + style: FilledButton.styleFrom( + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + visualDensity: VisualDensity.compact, + ), + child: const Text('发送'), + ), + ), + ], + ), + ), + ]; } @override diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 8ce2540a..6250b920 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -73,8 +73,9 @@ class _LiveRoomPageState extends State } videoSourceInit(); _futureBuilderFuture = _liveRoomController.queryLiveInfo(); - plPlayerController.autoEnterFullscreen(); - plPlayerController.addStatusLister(playerListener); + plPlayerController + ..autoEnterFullscreen() + ..addStatusLister(playerListener); _listener = plPlayerController.isFullScreen.listen((isFullScreen) { if (isFullScreen != _isFullScreen) { _isFullScreen = isFullScreen; @@ -93,7 +94,7 @@ class _LiveRoomPageState extends State } } - void _updateFontSize() async { + Future _updateFontSize() async { if (Platform.isAndroid) { _isPipMode = await const MethodChannel("floating").invokeMethod('inPipAlready'); @@ -125,8 +126,9 @@ class _LiveRoomPageState extends State ScreenBrightness().resetApplicationScreenBrightness(); PlPlayerController.setPlayCallBack(null); _liveRoomController.msgStream?.close(); - plPlayerController.removeStatusLister(playerListener); - plPlayerController.dispose(); + plPlayerController + ..removeStatusLister(playerListener) + ..dispose(); super.dispose(); } @@ -329,10 +331,7 @@ class _LiveRoomPageState extends State left: 0, right: 0, bottom: 0, - child: Padding( - padding: EdgeInsets.only(bottom: 0), - child: _buildInputWidget, - ), + child: _buildInputWidget, ), ), ], @@ -360,13 +359,13 @@ class _LiveRoomPageState extends State ); } - final Color _color = Color(0xFFEEEEEE); + final Color _color = const Color(0xFFEEEEEE); PreferredSizeWidget get _buildAppBar => AppBar( backgroundColor: Colors.transparent, foregroundColor: Colors.white, toolbarHeight: isFullScreen ? 0 : null, - titleTextStyle: TextStyle(color: Colors.white), + titleTextStyle: const TextStyle(color: Colors.white), title: Obx( () { return _liveRoomController.roomInfoH5.value == null @@ -551,7 +550,7 @@ class _LiveRoomPageState extends State right: 10, bottom: 25 + MediaQuery.of(context).padding.bottom, ), - decoration: BoxDecoration( + decoration: const BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(20), topRight: Radius.circular(20), @@ -617,7 +616,7 @@ class _LiveRoomPageState extends State }, transitionDuration: const Duration(milliseconds: 500), transitionBuilder: (context, animation, secondaryAnimation, child) { - var tween = Tween(begin: Offset(0.0, 1.0), end: Offset.zero) + var tween = Tween(begin: const Offset(0.0, 1.0), end: Offset.zero) .chain(CurveTween(curve: Curves.linear)); return SlideTransition( position: animation.drive(tween), diff --git a/lib/pages/live_room/widgets/bottom_control.dart b/lib/pages/live_room/widgets/bottom_control.dart index bbf9d7df..d579a63a 100644 --- a/lib/pages/live_room/widgets/bottom_control.dart +++ b/lib/pages/live_room/widgets/bottom_control.dart @@ -8,19 +8,20 @@ import 'package:get/get.dart'; class BottomControl extends StatelessWidget implements PreferredSizeWidget { const BottomControl({ + super.key, required this.plPlayerController, required this.liveRoomCtr, required this.onRefresh, - super.key, + this.subTitleStyle = const TextStyle(fontSize: 12), + this.titleStyle = const TextStyle(fontSize: 14), }); final PlPlayerController plPlayerController; final LiveRoomController liveRoomCtr; final VoidCallback onRefresh; - final TextStyle subTitleStyle = const TextStyle(fontSize: 12); - - final TextStyle titleStyle = const TextStyle(fontSize: 14); + final TextStyle subTitleStyle; + final TextStyle titleStyle; @override Size get preferredSize => const Size(double.infinity, kToolbarHeight); diff --git a/lib/pages/live_room/widgets/chat.dart b/lib/pages/live_room/widgets/chat.dart index fc21542f..7630f450 100644 --- a/lib/pages/live_room/widgets/chat.dart +++ b/lib/pages/live_room/widgets/chat.dart @@ -1,6 +1,5 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/pages/live_room/controller.dart'; -import 'package:PiliPlus/services/loggeer.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -26,10 +25,11 @@ class LiveRoomChat extends StatelessWidget { children: [ Obx( () => ListView.separated( - padding: const EdgeInsets.all(0), + padding: EdgeInsets.zero, controller: liveRoomController.scrollController, separatorBuilder: (context, index) => const SizedBox(height: 6), itemCount: liveRoomController.messages.length, + physics: const ClampingScrollPhysics(), itemBuilder: (context, index) { return Container( alignment: Alignment.centerLeft, @@ -40,7 +40,7 @@ class LiveRoomChat extends StatelessWidget { decoration: BoxDecoration( color: isPP == true ? Colors.black.withOpacity(0.3) - : Color(0x15FFFFFF), + : const Color(0x15FFFFFF), borderRadius: const BorderRadius.all(Radius.circular(18)), ), child: Text.rich( @@ -159,5 +159,3 @@ class LiveRoomChat extends StatelessWidget { } } } - -final PiliLogger logger = getLogger(); diff --git a/lib/pages/live_room/widgets/header_control.dart b/lib/pages/live_room/widgets/header_control.dart index 3d6a752e..43bb8219 100644 --- a/lib/pages/live_room/widgets/header_control.dart +++ b/lib/pages/live_room/widgets/header_control.dart @@ -94,7 +94,7 @@ class LiveHeaderControl extends StatelessWidget implements PreferredSizeWidget { plPlayerController.isFullScreen.value, true, ), - icon: Icon( + icon: const Icon( size: 18, Icons.schedule, color: Colors.white, diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 51123a17..efc0faa4 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -52,8 +52,9 @@ class LoginPageController extends GetxController @override void onClose() { - tabController.removeListener(_handleTabChange); - tabController.dispose(); + tabController + ..removeListener(_handleTabChange) + ..dispose(); qrCodeTimer?.cancel(); smsSendCooldownTimer?.cancel(); telTextController.dispose(); @@ -115,95 +116,97 @@ class LoginPageController extends GetxController success: true, ); - captcha.addEventHandler( - onShow: (Map message) async {}, - onClose: (Map message) async { - SmartDialog.showToast('关闭验证'); - }, - onResult: (Map message) async { - debugPrint("Captcha result: $message"); - String code = message["code"]; - if (code == "1") { - // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 - SmartDialog.showToast('验证成功'); - captchaData.validate = message['result']['geetest_validate']; - captchaData.seccode = message['result']['geetest_seccode']; - captchaData.geetest = GeetestData( - challenge: message['result']['geetest_challenge'], - gt: geeGt, - ); - onSuccess(); - } else { - // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. - debugPrint("Captcha result code : $code"); - } - }, - onError: (Map message) async { - SmartDialog.showToast("Captcha onError: $message"); - String code = message["code"]; - // 处理验证中返回的错误 Handling errors returned in verification - if (Platform.isAndroid) { - // Android 平台 - if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else if (code == "201") { - // 网络无法访问 Network inaccessible - } else if (code == "202") { - // Json 解析错误 Analysis error - } else if (code == "204") { - // WebView 加载超时,请检查是否混淆极验 SDK Load timed out - } else if (code == "204_1") { - // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log - } else if (code == "204_2") { - // WebView 加载 SSLError - } else if (code == "206") { - // gettype 接口错误或返回为 null API error or return null - } else if (code == "207") { - // getphp 接口错误或返回为 null API error or return null - } else if (code == "208") { - // ajax 接口错误或返回为 null API error or return null + captcha + ..addEventHandler( + onShow: (Map message) async {}, + onClose: (Map message) async { + SmartDialog.showToast('关闭验证'); + }, + onResult: (Map message) async { + debugPrint("Captcha result: $message"); + String code = message["code"]; + if (code == "1") { + // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 + SmartDialog.showToast('验证成功'); + captchaData + ..validate = message['result']['geetest_validate'] + ..seccode = message['result']['geetest_seccode'] + ..geetest = GeetestData( + challenge: message['result']['geetest_challenge'], + gt: geeGt, + ); + onSuccess(); } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/android + // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. + debugPrint("Captcha result code : $code"); + } + }, + onError: (Map message) async { + SmartDialog.showToast("Captcha onError: $message"); + String code = message["code"]; + // 处理验证中返回的错误 Handling errors returned in verification + if (Platform.isAndroid) { + // Android 平台 + if (code == "-2") { + // Dart 调用异常 Call exception + } else if (code == "-1") { + // Gt3RegisterData 参数不合法 Parameter is invalid + } else if (code == "201") { + // 网络无法访问 Network inaccessible + } else if (code == "202") { + // Json 解析错误 Analysis error + } else if (code == "204") { + // WebView 加载超时,请检查是否混淆极验 SDK Load timed out + } else if (code == "204_1") { + // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log + } else if (code == "204_2") { + // WebView 加载 SSLError + } else if (code == "206") { + // gettype 接口错误或返回为 null API error or return null + } else if (code == "207") { + // getphp 接口错误或返回为 null API error or return null + } else if (code == "208") { + // ajax 接口错误或返回为 null API error or return null + } else { + // 更多错误码参考开发文档 More error codes refer to the development document + // https://docs.geetest.com/sensebot/apirefer/errorcode/android + } } - } - if (Platform.isIOS) { - // iOS 平台 - if (code == "-1009") { - // 网络无法访问 Network inaccessible - } else if (code == "-1004") { - // 无法查找到 HOST Unable to find HOST - } else if (code == "-1002") { - // 非法的 URL Illegal URL - } else if (code == "-1001") { - // 网络超时 Network timeout - } else if (code == "-999") { - // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation - } else if (code == "-21") { - // 使用了重复的 challenge Duplicate challenges are used - // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached - } else if (code == "-20") { - // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again - } else if (code == "-10") { - // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification - } else if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/ios + if (Platform.isIOS) { + // iOS 平台 + if (code == "-1009") { + // 网络无法访问 Network inaccessible + } else if (code == "-1004") { + // 无法查找到 HOST Unable to find HOST + } else if (code == "-1002") { + // 非法的 URL Illegal URL + } else if (code == "-1001") { + // 网络超时 Network timeout + } else if (code == "-999") { + // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation + } else if (code == "-21") { + // 使用了重复的 challenge Duplicate challenges are used + // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached + } else if (code == "-20") { + // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again + } else if (code == "-10") { + // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification + } else if (code == "-2") { + // Dart 调用异常 Call exception + } else if (code == "-1") { + // Gt3RegisterData 参数不合法 Parameter is invalid + } else { + // 更多错误码参考开发文档 More error codes refer to the development document + // https://docs.geetest.com/sensebot/apirefer/errorcode/ios + } } - } - }); - captcha.startCaptcha(registerData); + }) + ..startCaptcha(registerData); } // cookie登录 - void loginByCookie() async { + Future loginByCookie() async { if (cookieTextController.text.isEmpty) { SmartDialog.showToast('cookie不能为空'); return; @@ -243,7 +246,7 @@ class LoginPageController extends GetxController } // app端密码登录 - void loginByPassword() async { + Future loginByPassword() async { String username = usernameTextController.text; String password = passwordTextController.text; if (username.isEmpty || password.isEmpty) { @@ -263,10 +266,10 @@ class LoginPageController extends GetxController password: password, key: key, salt: salt, - gee_validate: captchaData.validate, - gee_seccode: captchaData.seccode, - gee_challenge: captchaData.geetest?.challenge, - recaptcha_token: captchaData.token, + geeValidate: captchaData.validate, + geeSeccode: captchaData.seccode, + geeChallenge: captchaData.geetest?.challenge, + recaptchaToken: captchaData.token, ); if (res['status']) { var data = res['data']; @@ -301,9 +304,10 @@ class LoginPageController extends GetxController Get.dialog( AlertDialog( titlePadding: - EdgeInsets.only(left: 16, top: 18, right: 16, bottom: 12), - contentPadding: EdgeInsets.symmetric(horizontal: 16), - actionsPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), + const EdgeInsets.only(left: 16, top: 18, right: 16, bottom: 12), + contentPadding: const EdgeInsets.symmetric(horizontal: 16), + actionsPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 12), title: const Text( "本次登录需要验证您的手机号", textAlign: TextAlign.center, @@ -317,12 +321,12 @@ class LoginPageController extends GetxController ), // 带有清空按钮的输入框 TextField( - style: TextStyle(fontSize: 15), + style: const TextStyle(fontSize: 15), controller: textFieldController, textAlign: TextAlign.center, decoration: InputDecoration( hintText: "请输入短信验证码", - hintStyle: TextStyle(fontSize: 15), + hintStyle: const TextStyle(fontSize: 15), suffixIcon: iconButton( context: Get.context!, icon: Icons.clear, @@ -330,7 +334,7 @@ class LoginPageController extends GetxController bgColor: Colors.transparent, onPressed: textFieldController.clear, ), - suffixIconConstraints: BoxConstraints( + suffixIconConstraints: const BoxConstraints( maxHeight: 32, maxWidth: 32, ), @@ -430,8 +434,9 @@ class LoginPageController extends GetxController SmartDialog.showToast('正在保存身份信息'); await setAccount( data['token_info'], data['cookie_info']['cookies']); - Get.back(); - Get.back(); + Get + ..back() + ..back(); }, child: const Text("确认"), ), @@ -476,7 +481,7 @@ class LoginPageController extends GetxController } // 短信验证码登录 - void loginBySmsCode() async { + Future loginBySmsCode() async { if (telTextController.text.isEmpty) { SmartDialog.showToast('手机号不能为空'); return; @@ -518,7 +523,7 @@ class LoginPageController extends GetxController } // app端验证码 - void sendSmsCode() async { + Future sendSmsCode() async { if (telTextController.text.isEmpty) { SmartDialog.showToast('手机号不能为空'); return; @@ -569,10 +574,10 @@ class LoginPageController extends GetxController tel: telTextController.text, cid: selectedCountryCodeId['country_id'], // deviceTouristId: guestId, - gee_validate: captchaData.validate, - gee_seccode: captchaData.seccode, - gee_challenge: captchaData.geetest?.challenge, - recaptcha_token: captchaData.token, + geeValidate: captchaData.validate, + geeSeccode: captchaData.seccode, + geeChallenge: captchaData.geetest?.challenge, + recaptchaToken: captchaData.token, ); if (res['status']) { SmartDialog.showToast('发送成功'); diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index 62c156b8..91aa66d3 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -11,7 +11,7 @@ import 'package:get/get.dart'; import 'package:pretty_qr_code/pretty_qr_code.dart'; import 'package:saver_gallery/saver_gallery.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/login/controller.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @@ -85,7 +85,7 @@ class _LoginPageState extends State { height: 200, width: 200, alignment: Alignment.center, - child: CircularProgressIndicator( + child: const CircularProgressIndicator( semanticsLabel: '二维码加载中', ), ); @@ -97,10 +97,10 @@ class _LoginPageState extends State { padding: const EdgeInsets.all(8), child: PrettyQrView.data( data: _loginPageCtr.codeInfo['data']!['url']!, - decoration: PrettyQrDecoration( + decoration: const PrettyQrDecoration( shape: PrettyQrRoundedSymbol( color: Colors.black87, - borderRadius: BorderRadius.circular(0), + borderRadius: BorderRadius.zero, ), ), ), @@ -259,13 +259,14 @@ class _LoginPageState extends State { ), dense: false, onTap: () async { - Get.back(); - Get.toNamed('/webview', parameters: { - 'url': - 'https://passport.bilibili.com/h5-app/passport/login/findPassword', - 'type': 'url', - 'pageTitle': '忘记密码', - }); + Get + ..back() + ..toNamed('/webview', parameters: { + 'url': + 'https://passport.bilibili.com/h5-app/passport/login/findPassword', + 'type': 'url', + 'pageTitle': '忘记密码', + }); }), ListTile( title: const Text( @@ -277,14 +278,15 @@ class _LoginPageState extends State { ), dense: false, onTap: () async { - Get.back(); - Get.toNamed('/webview', parameters: { - 'url': - 'https://passport.bilibili.com/pc/passport/findPassword', - 'type': 'url', - 'pageTitle': '忘记密码', - 'uaType': 'pc' - }); + Get + ..back() + ..toNamed('/webview', parameters: { + 'url': + 'https://passport.bilibili.com/pc/passport/findPassword', + 'type': 'url', + 'pageTitle': '忘记密码', + 'uaType': 'pc' + }); }), ], ); @@ -324,7 +326,7 @@ class _LoginPageState extends State { const SizedBox(height: 10), Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - child: Container( + child: DecoratedBox( decoration: UnderlineTabIndicator( borderSide: BorderSide( color: theme.colorScheme.outline.withOpacity(0.4)), @@ -393,7 +395,7 @@ class _LoginPageState extends State { )), Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - child: Container( + child: DecoratedBox( decoration: UnderlineTabIndicator( borderSide: BorderSide( color: theme.colorScheme.outline.withOpacity(0.4)), @@ -541,7 +543,7 @@ class _LoginPageState extends State { child: Align( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: 600), + constraints: const BoxConstraints(maxWidth: 600), child: child, ), ), diff --git a/lib/pages/main/controller.dart b/lib/pages/main/controller.dart index 354eb4ff..fb70c2cb 100644 --- a/lib/pages/main/controller.dart +++ b/lib/pages/main/controller.dart @@ -170,7 +170,7 @@ class MainController extends GetxController { } catch (_) {} } - void getUnreadDynamic() async { + Future getUnreadDynamic() async { if (!isLogin.value || dynIndex == -1) { return; } @@ -181,7 +181,7 @@ class MainController extends GetxController { }); } - void setCount([int count = 0]) async { + Future setCount([int count = 0]) async { if (dynIndex == -1 || navigationBars[dynIndex]['count'] == count) return; navigationBars[dynIndex]['count'] = count; navigationBars.refresh(); @@ -201,13 +201,14 @@ class MainController extends GetxController { } } - void setNavBarConfig() async { + Future setNavBarConfig() async { List defaultNavTabs = [...defaultNavigationBars]; List navBarSort = GStorage.setting.get(SettingBoxKey.navBarSort, defaultValue: [0, 1, 2]); - defaultNavTabs.retainWhere((item) => navBarSort.contains(item['id'])); - defaultNavTabs.sort((a, b) => - navBarSort.indexOf(a['id']).compareTo(navBarSort.indexOf(b['id']))); + defaultNavTabs + ..retainWhere((item) => navBarSort.contains(item['id'])) + ..sort((a, b) => + navBarSort.indexOf(a['id']).compareTo(navBarSort.indexOf(b['id']))); navigationBars.value = defaultNavTabs; int defaultHomePage = GStorage.setting .get(SettingBoxKey.defaultHomePage, defaultValue: 0) as int; diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 7437c2dd..49cc02f1 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -99,8 +99,9 @@ class _MainAppState extends State } int now = DateTime.now().millisecondsSinceEpoch; if (now - _homeController.lateCheckSearchAt >= 5 * 60 * 1000) { - _homeController.lateCheckSearchAt = now; - _homeController.querySearchDefault(); + _homeController + ..lateCheckSearchAt = now + ..querySearchDefault(); } } } @@ -116,13 +117,14 @@ class _MainAppState extends State } int now = DateTime.now().millisecondsSinceEpoch; if (now - _mainController.lastCheckUnreadAt >= 5 * 60 * 1000) { - _mainController.lastCheckUnreadAt = now; - _mainController.queryUnreadMsg(); + _mainController + ..lastCheckUnreadAt = now + ..queryUnreadMsg(); } } } - void setIndex(int value) async { + Future setIndex(int value) async { feedBack(); if (value != _mainController.selectedIndex.value) { @@ -225,9 +227,12 @@ class _MainAppState extends State backgroundColor: Colors.transparent, tilePadding: const EdgeInsets.symmetric( vertical: 5, horizontal: 12), - indicatorShape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(16)), + indicatorShape: + const RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(16), + ), + ), onDestinationSelected: setIndex, selectedIndex: _mainController.selectedIndex.value, @@ -283,7 +288,7 @@ class _MainAppState extends State : SafeArea( right: false, child: Container( - padding: EdgeInsets.only( + padding: const EdgeInsets.only( top: 10, ), width: 80, diff --git a/lib/pages/media/view.dart b/lib/pages/media/view.dart index 4805e229..e6305fa6 100644 --- a/lib/pages/media/view.dart +++ b/lib/pages/media/view.dart @@ -279,7 +279,7 @@ class FavFolderItem extends StatelessWidget { margin: const EdgeInsets.only(bottom: 8), clipBehavior: Clip.hardEdge, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), + borderRadius: const BorderRadius.all(Radius.circular(12)), color: theme.colorScheme.onInverseSurface.withOpacity(0.4), boxShadow: [ BoxShadow( diff --git a/lib/pages/member/controller.dart b/lib/pages/member/controller.dart index 9c0d5bef..11e6eb4a 100644 --- a/lib/pages/member/controller.dart +++ b/lib/pages/member/controller.dart @@ -18,7 +18,7 @@ import 'package:intl/intl.dart'; enum MemberTabType { none, home, dynamic, contribute, favorite, bangumi } extension MemberTabTypeExt on MemberTabType { - String get title => ['默认', '首页', '动态', '投稿', '收藏', '番剧'][index]; + String get title => const ['默认', '首页', '动态', '投稿', '收藏', '番剧'][index]; } class MemberController extends CommonDataController @@ -192,7 +192,7 @@ class MemberController extends CommonDataController Utils.shareText('https://space.bilibili.com/$mid'); } - void _onBlock() async { + Future _onBlock() async { dynamic res = await VideoHttp.relationMod( mid: mid, act: relation.value != 128 ? 5 : 6, @@ -203,7 +203,7 @@ class MemberController extends CommonDataController } } - void onFollow(BuildContext context) async { + Future onFollow(BuildContext context) async { if (mid == ownerMid) { Get.toNamed('/editProfile'); } else if (relation.value == 128) { diff --git a/lib/pages/member/view.dart b/lib/pages/member/view.dart index dfe5c484..cb5835ed 100644 --- a/lib/pages/member/view.dart +++ b/lib/pages/member/view.dart @@ -103,9 +103,9 @@ class _MemberPageState extends State { if (_userController.isFollowed == 1) PopupMenuItem( onTap: _userController.onRemoveFan, - child: Row( + child: const Row( mainAxisSize: MainAxisSize.min, - children: const [ + children: [ Icon(Icons.remove_circle_outline_outlined, size: 19), SizedBox(width: 10), Text('移除粉丝'), @@ -197,7 +197,7 @@ class _MemberPageState extends State { ], ), ) - : Center(child: const Text('EMPTY')), + : const Center(child: Text('EMPTY')), ); }, ) @@ -288,7 +288,7 @@ class _MemberPageState extends State { : GestureDetector( onTap: _userController.onReload, behavior: HitTestBehavior.opaque, - child: SizedBox(height: 56, width: double.infinity), + child: const SizedBox(height: 56, width: double.infinity), ), Error() => _errorWidget(userState.errMsg), }; diff --git a/lib/pages/member/widget/user_info_card.dart b/lib/pages/member/widget/user_info_card.dart index 72b29df3..0eababe2 100644 --- a/lib/pages/member/widget/user_info_card.dart +++ b/lib/pages/member/widget/user_info_card.dart @@ -55,7 +55,7 @@ class UserInfoCard extends StatelessWidget { children: [ Text( Utils.numFormat(count), - style: TextStyle( + style: const TextStyle( fontSize: 14, ), ), @@ -72,7 +72,7 @@ class UserInfoCard extends StatelessWidget { ); } - _buildHeader(BuildContext context, ThemeData theme) { + Widget _buildHeader(BuildContext context, ThemeData theme) { bool darken = theme.brightness == Brightness.dark; String imgUrl = (darken ? images.nightImgurl?.isEmpty == true @@ -109,7 +109,7 @@ class UserInfoCard extends StatelessWidget { ); } - _buildLeft(BuildContext context, ThemeData theme) => [ + List _buildLeft(BuildContext context, ThemeData theme) => [ Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: Wrap( @@ -158,7 +158,7 @@ class UserInfoCard extends StatelessWidget { fontSize: 10, fontWeight: FontWeight.bold, ), - style: TextStyle( + style: const TextStyle( height: 1, fontWeight: FontWeight.bold, fontSize: 10, @@ -205,7 +205,7 @@ class UserInfoCard extends StatelessWidget { ), ), ), - TextSpan( + const TextSpan( text: ' ', ) ], @@ -267,7 +267,7 @@ class UserInfoCard extends StatelessWidget { return Container( width: double.infinity, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), color: isLight ? theme.colorScheme.errorContainer : theme.colorScheme.error, @@ -302,7 +302,7 @@ class UserInfoCard extends StatelessWidget { }), ]; - _buildRight(BuildContext context, ThemeData theme) => Column( + Column _buildRight(BuildContext context, ThemeData theme) => Column( mainAxisSize: MainAxisSize.min, children: [ Row( @@ -327,7 +327,7 @@ class UserInfoCard extends StatelessWidget { } }, ) - : SizedBox( + : const SizedBox( height: 15, width: 1, child: VerticalDivider(), @@ -362,10 +362,7 @@ class UserInfoCard extends StatelessWidget { ), padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), ), const SizedBox(width: 10), @@ -377,10 +374,7 @@ class UserInfoCard extends StatelessWidget { backgroundColor: relation != 0 ? theme.colorScheme.onInverseSurface : null, - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, ), child: Text.rich( style: TextStyle( @@ -421,7 +415,7 @@ class UserInfoCard extends StatelessWidget { ], ); - _buildAvatar(BuildContext context) => Hero( + Hero _buildAvatar(BuildContext context) => Hero( tag: card.face ?? '', child: Avatar( avatar: card.face ?? '', @@ -435,7 +429,7 @@ class UserInfoCard extends StatelessWidget { .imageView(imgList: [SourceModel(url: card.face.http2https)]), )); - _buildV(BuildContext context, ThemeData theme) => Column( + Column _buildV(BuildContext context, ThemeData theme) => Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, @@ -533,7 +527,7 @@ class UserInfoCard extends StatelessWidget { ); }); - _buildH(BuildContext context, ThemeData theme) => Column( + Column _buildH(BuildContext context, ThemeData theme) => Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/member_article/view.dart b/lib/pages/member_article/view.dart index 413d565f..ce5f89f5 100644 --- a/lib/pages/member_article/view.dart +++ b/lib/pages/member_article/view.dart @@ -38,7 +38,7 @@ class _MemberArticleState extends State return Obx(() => _buildBody(_controller.loadingState.value)); } - _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => loadingWidget, Success() => loadingState.response?.isNotEmpty == true diff --git a/lib/pages/member_audio/view.dart b/lib/pages/member_audio/view.dart index 4b7936f5..8c0e4cb3 100644 --- a/lib/pages/member_audio/view.dart +++ b/lib/pages/member_audio/view.dart @@ -20,7 +20,7 @@ class _MemberAudioState extends State @override Widget build(BuildContext context) { super.build(context); - return Center( + return const Center( child: Text('Audio'), ); } diff --git a/lib/pages/member_contribute/view.dart b/lib/pages/member_contribute/view.dart index 75968bea..7ab5dbb6 100644 --- a/lib/pages/member_contribute/view.dart +++ b/lib/pages/member_contribute/view.dart @@ -60,7 +60,7 @@ class _MemberContributeState extends State const EdgeInsets.symmetric(horizontal: 3, vertical: 8), indicator: BoxDecoration( color: theme.colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(20), + borderRadius: const BorderRadius.all(Radius.circular(20)), ), indicatorSize: TabBarIndicatorSize.tab, labelStyle: TabBarTheme.of(context) diff --git a/lib/pages/member_dynamics/controller.dart b/lib/pages/member_dynamics/controller.dart index ce771b72..defa5d17 100644 --- a/lib/pages/member_dynamics/controller.dart +++ b/lib/pages/member_dynamics/controller.dart @@ -14,7 +14,7 @@ class MemberDynamicsController String offset = ''; @override - void onInit() async { + void onInit() { super.onInit(); queryData(); } @@ -79,8 +79,9 @@ class MemberDynamicsController } else { final item = list.firstWhere((item) => item.idStr == dynamicId); item.modules.moduleTag = ModuleTag(text: '置顶'); - list.remove(item); - list.insert(0, item); + list + ..remove(item) + ..insert(0, item); loadingState.refresh(); SmartDialog.showToast('置顶成功'); } diff --git a/lib/pages/member_favorite/view.dart b/lib/pages/member_favorite/view.dart index c7e56cff..61e2a417 100644 --- a/lib/pages/member_favorite/view.dart +++ b/lib/pages/member_favorite/view.dart @@ -38,7 +38,7 @@ class _MemberFavoriteState extends State return Obx(() => _buildBody(_controller.loadingState.value)); } - _buildBody(LoadingState loadingState) { + Widget _buildBody(LoadingState loadingState) { final theme = Theme.of(context); return switch (loadingState) { Loading() => loadingWidget, @@ -77,7 +77,7 @@ class _MemberFavoriteState extends State }; } - _buildItem(ThemeData theme, SpaceFavData data, bool isFirst) { + Theme _buildItem(ThemeData theme, SpaceFavData data, bool isFirst) { return Theme( data: theme.copyWith( dividerColor: Colors.transparent, @@ -90,7 +90,7 @@ class _MemberFavoriteState extends State children: [ TextSpan( text: data.name, - style: TextStyle(fontSize: 14), + style: const TextStyle(fontSize: 14), ), TextSpan( text: ' ${data.mediaListResponse?.count}', @@ -135,7 +135,7 @@ class _MemberFavoriteState extends State ); } - _buildLoadMoreItem(ThemeData theme, bool isFirst) { + ListTile _buildLoadMoreItem(ThemeData theme, bool isFirst) { return ListTile( dense: true, onTap: () { diff --git a/lib/pages/member_favorite/widget/item.dart b/lib/pages/member_favorite/widget/item.dart index 0265f3fa..8f9dae82 100644 --- a/lib/pages/member_favorite/widget/item.dart +++ b/lib/pages/member_favorite/widget/item.dart @@ -85,7 +85,7 @@ class MemberFavItem extends StatelessWidget { height: boxConstraints.maxHeight, ), if (item.type == 21) - PBadge( + const PBadge( right: 3, bottom: 3, text: '合集', diff --git a/lib/pages/member_pgc/view.dart b/lib/pages/member_pgc/view.dart index e1ecbbc8..d5cb610f 100644 --- a/lib/pages/member_pgc/view.dart +++ b/lib/pages/member_pgc/view.dart @@ -42,7 +42,7 @@ class _MemberBangumiState extends State return Obx(() => _buildBody(_controller.loadingState.value)); } - _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => loadingWidget, Success() => loadingState.response?.isNotEmpty == true diff --git a/lib/pages/member_profile/view.dart b/lib/pages/member_profile/view.dart index 84ae3c13..3ed8afc5 100644 --- a/lib/pages/member_profile/view.dart +++ b/lib/pages/member_profile/view.dart @@ -54,7 +54,7 @@ class _EditProfilePageState extends State { ); } - _getInfo() async { + Future _getInfo() async { Map data = { 'build': '1462100', 'c_locale': 'zh_CN', @@ -271,7 +271,7 @@ class _EditProfilePageState extends State { minLines: type == ProfileType.uname ? 1 : 4, maxLines: type == ProfileType.uname ? 1 : 4, autofocus: true, - style: TextStyle(fontSize: 14), + style: const TextStyle(fontSize: 14), textInputAction: type == ProfileType.sign ? TextInputAction.newline : null, inputFormatters: [ @@ -312,7 +312,7 @@ class _EditProfilePageState extends State { }); } - _update({ + Future _update({ required ProfileType type, dynamic datum, }) async { @@ -394,7 +394,7 @@ class _EditProfilePageState extends State { dense: title != '头像', leading: Text( title, - style: TextStyle( + style: const TextStyle( fontSize: 14, fontWeight: FontWeight.normal, ), @@ -425,7 +425,7 @@ class _EditProfilePageState extends State { ); } - void _pickImg(ThemeData theme) async { + Future _pickImg(ThemeData theme) async { try { XFile? pickedFile = await _imagePicker.pickImage( source: ImageSource.gallery, diff --git a/lib/pages/member_search/index.dart b/lib/pages/member_search/index.dart deleted file mode 100644 index 4f10617b..00000000 --- a/lib/pages/member_search/index.dart +++ /dev/null @@ -1,4 +0,0 @@ -library member_search; - -export './controller.dart'; -export './view.dart'; diff --git a/lib/pages/member_search/view.dart b/lib/pages/member_search/view.dart index 79241008..0bcfcb02 100644 --- a/lib/pages/member_search/view.dart +++ b/lib/pages/member_search/view.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/pages/member_search/search_archive.dart'; import 'package:PiliPlus/pages/member_search/search_dynamic.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/member_search/controller.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; class MemberSearchPage extends StatefulWidget { diff --git a/lib/pages/member_video/controller.dart b/lib/pages/member_video/controller.dart index 06ad596f..e4f6c9d8 100644 --- a/lib/pages/member_video/controller.dart +++ b/lib/pages/member_video/controller.dart @@ -74,8 +74,9 @@ class MemberVideoCtr bool customHandleResponse( bool isRefresh, Success response) { SpaceArchiveData data = response.response; - episodicButton.value = data.episodicButton ?? EpisodicButton(); - episodicButton.refresh(); + episodicButton + ..value = data.episodicButton ?? EpisodicButton() + ..refresh(); next = data.next; if (currentPage == 0 || isLoadPrevious == true) { hasPrev = data.hasPrev; @@ -129,7 +130,7 @@ class MemberVideoCtr includeCursor: isLocating == true && currentPage == 0 ? true : null, ); - queryBySort() { + void queryBySort() { if (type == ContributeType.video) { isLocating = null; order.value = order.value == 'pubdate' ? 'click' : 'pubdate'; @@ -139,7 +140,7 @@ class MemberVideoCtr onReload(); } - void toViewPlayAll() async { + Future toViewPlayAll() async { if (loadingState.value is Success) { List? list = (loadingState.value as Success).response; diff --git a/lib/pages/member_video/view.dart b/lib/pages/member_video/view.dart index ba3745a1..2f4f7b58 100644 --- a/lib/pages/member_video/view.dart +++ b/lib/pages/member_video/view.dart @@ -59,7 +59,7 @@ class _MemberVideoState extends State return Obx(() => _buildBody(_controller.loadingState.value)); } - _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { final theme = Theme.of(context); return switch (loadingState) { Loading() => loadingWidget, @@ -74,7 +74,7 @@ class _MemberVideoState extends State child: CustomScrollView( physics: PositionRetainedScrollPhysics( shouldRetain: _controller.isLocating == true, - parent: ClampingScrollPhysics(), + parent: const ClampingScrollPhysics(), ), slivers: [ SliverPersistentHeader( diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index cb98e0b6..4b542ceb 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -28,7 +28,7 @@ class MineController extends GetxController { ThemeType.values[(themeType.value.index + 1) % ThemeType.values.length]; @override - onInit() { + void onInit() { super.onInit(); dynamic userInfoCache = GStorage.userInfo.get('userInfoCache'); @@ -38,7 +38,7 @@ class MineController extends GetxController { } } - onLogin([bool longPress = false]) async { + Future onLogin([bool longPress = false]) async { if (!isLogin.value || longPress) { Get.toNamed('/loginPage', preventDuplicates: false); } else { @@ -80,7 +80,7 @@ class MineController extends GetxController { } } - static onChangeAnonymity(BuildContext context) { + static void onChangeAnonymity(BuildContext context) { if (Accounts.account.isEmpty) { SmartDialog.showToast('请先登录'); return; @@ -196,7 +196,7 @@ class MineController extends GetxController { } } - onChangeTheme() { + void onChangeTheme() { themeType.value = nextThemeType; try { Get.find().themeType.value = themeType.value; @@ -205,7 +205,7 @@ class MineController extends GetxController { Get.changeThemeMode(themeType.value.toThemeMode); } - pushFollow() { + void pushFollow() { if (!isLogin.value) { SmartDialog.showToast('账号未登录'); return; @@ -213,7 +213,7 @@ class MineController extends GetxController { Get.toNamed('/follow?mid=${userInfo.value.mid}', preventDuplicates: false); } - pushFans() { + void pushFans() { if (!isLogin.value) { SmartDialog.showToast('账号未登录'); return; @@ -221,7 +221,7 @@ class MineController extends GetxController { Get.toNamed('/fan?mid=${userInfo.value.mid}', preventDuplicates: false); } - pushDynamic() { + void pushDynamic() { if (!isLogin.value) { SmartDialog.showToast('账号未登录'); return; diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index f67b56f1..d23e4a26 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -5,7 +5,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/theme_type.dart'; import 'package:PiliPlus/models/user/info.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/mine/controller.dart'; class MinePage extends StatefulWidget { const MinePage({super.key}); diff --git a/lib/pages/msg_feed_top/at_me/view.dart b/lib/pages/msg_feed_top/at_me/view.dart index 628c8bdd..614d96da 100644 --- a/lib/pages/msg_feed_top/at_me/view.dart +++ b/lib/pages/msg_feed_top/at_me/view.dart @@ -10,7 +10,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/msg_feed_top/at_me/controller.dart'; class AtMePage extends StatefulWidget { const AtMePage({super.key}); diff --git a/lib/pages/msg_feed_top/sys_msg/view.dart b/lib/pages/msg_feed_top/sys_msg/view.dart index 1e28dce8..21b9ef2d 100644 --- a/lib/pages/msg_feed_top/sys_msg/view.dart +++ b/lib/pages/msg_feed_top/sys_msg/view.dart @@ -15,7 +15,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/msg_feed_top/sys_msg/controller.dart'; class SysMsgPage extends StatefulWidget { const SysMsgPage({super.key}); @@ -82,7 +82,6 @@ class _SysMsgPageState extends State { } catch (_) {} } return ListTile( - onTap: () {}, onLongPress: () { showConfirmDialog( context: context, @@ -173,47 +172,49 @@ class _SysMsgPageState extends State { } else { IdUtils.av2bv(int.parse(match[3]!)); } - spanChildren.add(TextSpan(text: '【')); - spanChildren.add( - TextSpan( - text: match[3], - style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() - ..onTap = () { - try { - PiliScheme.videoPush( - isBV ? null : int.parse(match[3]!), - isBV ? match[3]! : null, - ); - } catch (err) { - SmartDialog.showToast(err.toString()); - } - }, - ), - ); - spanChildren.add(TextSpan(text: '】')); + spanChildren + ..add(const TextSpan(text: '【')) + ..add( + TextSpan( + text: match[3], + style: TextStyle(color: theme.colorScheme.primary), + recognizer: TapGestureRecognizer() + ..onTap = () { + try { + PiliScheme.videoPush( + isBV ? null : int.parse(match[3]!), + isBV ? match[3]! : null, + ); + } catch (err) { + SmartDialog.showToast(err.toString()); + } + }, + ), + ) + ..add(const TextSpan(text: '】')); } catch (e) { spanChildren.add(TextSpan(text: match[0])); } } else if (matchStr.startsWith('(')) { try { match[4]; // dynId - spanChildren.add(TextSpan(text: '(')); - spanChildren.add( - TextSpan( - text: '查看动态', - style: TextStyle(color: theme.colorScheme.primary), - recognizer: TapGestureRecognizer() - ..onTap = () { - try { - PageUtils.pushDynFromId(id: match[4]); - } catch (err) { - SmartDialog.showToast(err.toString()); - } - }, - ), - ); - spanChildren.add(TextSpan(text: ')')); + spanChildren + ..add(const TextSpan(text: '(')) + ..add( + TextSpan( + text: '查看动态', + style: TextStyle(color: theme.colorScheme.primary), + recognizer: TapGestureRecognizer() + ..onTap = () { + try { + PageUtils.pushDynFromId(id: match[4]); + } catch (err) { + SmartDialog.showToast(err.toString()); + } + }, + ), + ) + ..add(const TextSpan(text: ')')); } catch (e) { spanChildren.add(TextSpan(text: match[0])); } diff --git a/lib/pages/pgc_index/view.dart b/lib/pages/pgc_index/view.dart index 5fb20162..1584e4d7 100644 --- a/lib/pages/pgc_index/view.dart +++ b/lib/pages/pgc_index/view.dart @@ -56,7 +56,7 @@ class _PgcIndexPageState extends State child: CustomScrollView( slivers: [ if (widget.indexType != null) - SliverToBoxAdapter(child: const SizedBox(height: 12)), + const SliverToBoxAdapter(child: SizedBox(height: 12)), SliverToBoxAdapter( child: AnimatedSize( curve: Curves.easeInOut, @@ -205,7 +205,7 @@ class _PgcIndexPageState extends State Widget _buildList(LoadingState?> loadingState) { return switch (loadingState) { - Loading() => HttpError(errMsg: '加载中'), + Loading() => const HttpError(errMsg: '加载中'), Success() => loadingState.response?.isNotEmpty == true ? SliverGrid( gridDelegate: SliverGridDelegateWithExtentAndRatio( diff --git a/lib/pages/rank/view.dart b/lib/pages/rank/view.dart index 5bd70f52..5d48f433 100644 --- a/lib/pages/rank/view.dart +++ b/lib/pages/rank/view.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/models/common/rank_type.dart'; import 'package:PiliPlus/pages/rank/zone/view.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import './controller.dart'; +import 'package:PiliPlus/pages/rank/controller.dart'; class RankPage extends StatefulWidget { const RankPage({super.key}); diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 80c51c6f..c46b1b93 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -74,8 +74,9 @@ class _RcmdPageState extends CommonPageState if (controller.lastRefreshAt == index) { return GestureDetector( onTap: () { - controller.animateToTop(); - controller.onRefresh(); + controller + ..animateToTop() + ..onRefresh(); }, child: Card( margin: EdgeInsets.zero, diff --git a/lib/pages/save_panel/view.dart b/lib/pages/save_panel/view.dart index e574b134..dbcf9aa8 100644 --- a/lib/pages/save_panel/view.dart +++ b/lib/pages/save_panel/view.dart @@ -221,7 +221,7 @@ class _SavePanelState extends State { return uri; } - void _onSaveOrSharePic([bool isShare = false]) async { + Future _onSaveOrSharePic([bool isShare = false]) async { if (!isShare) { if (mounted && !await DownloadUtils.checkPermissionDependOnSdkInt(context)) { @@ -297,7 +297,8 @@ class _SavePanelState extends State { clipBehavior: Clip.hardEdge, decoration: BoxDecoration( color: theme.colorScheme.surface, - borderRadius: BorderRadius.circular(12), + borderRadius: + const BorderRadius.all(Radius.circular(12)), ), child: AnimatedSize( curve: Curves.easeInOut, @@ -334,7 +335,8 @@ class _SavePanelState extends State { padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(8), + borderRadius: const BorderRadius.all( + Radius.circular(8)), ), child: Row( children: [ diff --git a/lib/pages/search/controller.dart b/lib/pages/search/controller.dart index 4b41b727..6a257531 100644 --- a/lib/pages/search/controller.dart +++ b/lib/pages/search/controller.dart @@ -96,7 +96,7 @@ class SSearchController extends GetxController { } // 搜索 - void submit() async { + Future submit() async { if (controller.text.isEmpty) { if (hintText.isEmpty) { return; @@ -106,8 +106,9 @@ class SSearchController extends GetxController { } if (recordSearchHistory.value) { - historyList.remove(controller.text); - historyList.insert(0, controller.text); + historyList + ..remove(controller.text) + ..insert(0, controller.text); GStorage.historyWord.put('cacheList', historyList); } @@ -153,12 +154,12 @@ class SSearchController extends GetxController { } } - onLongSelect(word) { + void onLongSelect(word) { historyList.remove(word); GStorage.historyWord.put('cacheList', historyList); } - onClearHistory() { + void onClearHistory() { showConfirmDialog( context: Get.context!, title: '确定清空搜索历史?', diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index 65ee2c2d..94350af0 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -7,9 +7,9 @@ import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'controller.dart'; -import 'widgets/hot_keyword.dart'; -import 'widgets/search_text.dart'; +import 'package:PiliPlus/pages/search/controller.dart'; +import 'package:PiliPlus/pages/search/widgets/hot_keyword.dart'; +import 'package:PiliPlus/pages/search/widgets/search_text.dart'; class SearchPage extends StatefulWidget { const SearchPage({super.key}); @@ -121,9 +121,7 @@ class _SearchPageState extends State { children: _searchController.searchSuggestList .map( (item) => InkWell( - customBorder: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4), - ), + borderRadius: const BorderRadius.all(Radius.circular(4)), onTap: () => _searchController.onClickKeyword(item.term!), child: Container( width: double.infinity, @@ -197,8 +195,8 @@ class _SearchPageState extends State { SizedBox( height: 34, child: TextButton.icon( - style: ButtonStyle( - padding: const WidgetStatePropertyAll( + style: const ButtonStyle( + padding: WidgetStatePropertyAll( EdgeInsets.symmetric(horizontal: 10, vertical: 6)), ), onPressed: isHot @@ -254,7 +252,7 @@ class _SearchPageState extends State { children: [ Text( '搜索历史', - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: const StrutStyle(leading: 0, height: 1), style: theme.textTheme.titleMedium! .copyWith(height: 1, fontWeight: FontWeight.bold), ), diff --git a/lib/pages/search/widgets/hot_keyword.dart b/lib/pages/search/widgets/hot_keyword.dart index 3588b583..626f7172 100644 --- a/lib/pages/search/widgets/hot_keyword.dart +++ b/lib/pages/search/widgets/hot_keyword.dart @@ -15,7 +15,7 @@ class HotKeyword extends StatelessWidget { required this.hotSearchList, this.onClick, this.showMore = true, - }) : this.width = width / 2 - 4; + }) : width = width / 2 - 4; @override Widget build(BuildContext context) { diff --git a/lib/pages/search/widgets/search_text.dart b/lib/pages/search/widgets/search_text.dart index 8decac7f..389ce574 100644 --- a/lib/pages/search/widgets/search_text.dart +++ b/lib/pages/search/widgets/search_text.dart @@ -27,7 +27,7 @@ class SearchText extends StatelessWidget { late final theme = Theme.of(context); return Material( color: bgColor ?? theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), child: InkWell( onTap: () { onTap?.call(text); @@ -37,7 +37,7 @@ class SearchText extends StatelessWidget { onLongPress!(text); } : null, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), child: Padding( padding: padding ?? const EdgeInsets.symmetric(horizontal: 11, vertical: 5), diff --git a/lib/pages/search_panel/all/controller.dart b/lib/pages/search_panel/all/controller.dart index 3007e684..52d5f1bc 100644 --- a/lib/pages/search_panel/all/controller.dart +++ b/lib/pages/search_panel/all/controller.dart @@ -51,7 +51,7 @@ class SearchAllController pubEnd: pubEnd, ); - void onPushDetail(resultList) async { + Future onPushDetail(resultList) async { try { int? aid = int.tryParse(keyword); if (aid != null && resultList.first.aid == aid) { diff --git a/lib/pages/search_panel/article/controller.dart b/lib/pages/search_panel/article/controller.dart index 6d5f162b..308d0a57 100644 --- a/lib/pages/search_panel/article/controller.dart +++ b/lib/pages/search_panel/article/controller.dart @@ -60,7 +60,7 @@ class SearchArticleController RxInt currentOrderFilterval = 0.obs; RxInt currentZoneFilterval = 0.obs; - onShowFilterDialog(BuildContext context) { + void onShowFilterDialog(BuildContext context) { showModalBottomSheet( context: context, useSafeArea: true, diff --git a/lib/pages/search_panel/live/widgets/item.dart b/lib/pages/search_panel/live/widgets/item.dart index af36e289..1e5c5ea6 100644 --- a/lib/pages/search_panel/live/widgets/item.dart +++ b/lib/pages/search_panel/live/widgets/item.dart @@ -27,39 +27,36 @@ class LiveItem extends StatelessWidget { ), child: Column( children: [ - ClipRRect( - borderRadius: BorderRadius.all(StyleString.imgRadius), - child: AspectRatio( - aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder(builder: (context, boxConstraints) { - double maxWidth = boxConstraints.maxWidth; - double maxHeight = boxConstraints.maxHeight; - return Stack( - clipBehavior: Clip.none, - children: [ - NetworkImgLayer( - src: liveItem.cover, - type: 'emote', - width: maxWidth, - height: maxHeight, - ), - Positioned( - left: 0, - right: 0, - bottom: 0, - child: AnimatedOpacity( - opacity: 1, - duration: const Duration(milliseconds: 200), - child: liveStat( - liveItem.online, - liveItem.cateName, - ), + AspectRatio( + aspectRatio: StyleString.aspectRatio, + child: LayoutBuilder(builder: (context, boxConstraints) { + double maxWidth = boxConstraints.maxWidth; + double maxHeight = boxConstraints.maxHeight; + return Stack( + clipBehavior: Clip.none, + children: [ + NetworkImgLayer( + src: liveItem.cover, + type: 'emote', + width: maxWidth, + height: maxHeight, + ), + Positioned( + left: 0, + right: 0, + bottom: 0, + child: AnimatedOpacity( + opacity: 1, + duration: const Duration(milliseconds: 200), + child: liveStat( + liveItem.online, + liveItem.cateName, ), ), - ], - ); - }), - ), + ), + ], + ); + }), ), liveContent(theme) ], diff --git a/lib/pages/search_panel/pgc/widgets/item.dart b/lib/pages/search_panel/pgc/widgets/item.dart index 5e3b3eac..18a062ca 100644 --- a/lib/pages/search_panel/pgc/widgets/item.dart +++ b/lib/pages/search_panel/pgc/widgets/item.dart @@ -18,7 +18,7 @@ class SearchPgcItem extends StatelessWidget { @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); - final TextStyle style = TextStyle(fontSize: 13); + const TextStyle style = TextStyle(fontSize: 13); return InkWell( onTap: () { PageUtils.viewBangumi(seasonId: item.seasonId); diff --git a/lib/pages/search_panel/user/controller.dart b/lib/pages/search_panel/user/controller.dart index bbb36615..7038c9f9 100644 --- a/lib/pages/search_panel/user/controller.dart +++ b/lib/pages/search_panel/user/controller.dart @@ -32,7 +32,7 @@ class SearchUserController RxInt currentOrderFilterval = 0.obs; RxInt currentUserTypeFilterval = 0.obs; - onShowFilterDialog(BuildContext context) { + void onShowFilterDialog(BuildContext context) { showModalBottomSheet( context: context, useSafeArea: true, diff --git a/lib/pages/search_panel/video/controller.dart b/lib/pages/search_panel/video/controller.dart index 30cb51e8..483cee16 100644 --- a/lib/pages/search_panel/video/controller.dart +++ b/lib/pages/search_panel/video/controller.dart @@ -62,7 +62,7 @@ class SearchVideoController return false; } - void onPushDetail(resultList) async { + Future onPushDetail(resultList) async { try { int? aid = int.tryParse(keyword); if (aid != null && resultList.first.aid == aid) { @@ -140,7 +140,7 @@ class SearchVideoController int currentTimeFilter = 0; int currentZoneFilter = 0; - onShowFilterDialog(BuildContext context) { + void onShowFilterDialog(BuildContext context) { showModalBottomSheet( context: context, useSafeArea: true, diff --git a/lib/pages/search_panel/view.dart b/lib/pages/search_panel/view.dart index 509bf704..b42b9cf7 100644 --- a/lib/pages/search_panel/view.dart +++ b/lib/pages/search_panel/view.dart @@ -12,7 +12,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/models/common/search_type.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/search_panel/controller.dart'; abstract class CommonSearchPanel extends StatefulWidget { const CommonSearchPanel({ diff --git a/lib/pages/search_result/view.dart b/lib/pages/search_result/view.dart index 4d9f660f..e245c884 100644 --- a/lib/pages/search_result/view.dart +++ b/lib/pages/search_result/view.dart @@ -8,7 +8,7 @@ import 'package:PiliPlus/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/models/common/search_type.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/search_result/controller.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; class SearchResultPage extends StatefulWidget { @@ -55,8 +55,9 @@ class _SearchResultPageState extends State @override void dispose() { - _tabController.removeListener(listener); - _tabController.dispose(); + _tabController + ..removeListener(listener) + ..dispose(); super.dispose(); } diff --git a/lib/pages/search_trending/view.dart b/lib/pages/search_trending/view.dart index 0bcb1ec5..9784ba85 100644 --- a/lib/pages/search_trending/view.dart +++ b/lib/pages/search_trending/view.dart @@ -65,7 +65,7 @@ class _SearchTrendingPageState extends State { extendBody: true, extendBodyBehindAppBar: true, appBar: PreferredSize( - preferredSize: Size.fromHeight(56), + preferredSize: const Size.fromHeight(56), child: Obx( () { final flag = removePadding || _scrollRatio.value >= 0.5; @@ -84,13 +84,13 @@ class _SearchTrendingPageState extends State { foregroundColor: flag ? null : Colors.white, systemOverlayStyle: flag ? null - : SystemUiOverlayStyle( + : const SystemUiOverlayStyle( statusBarBrightness: Brightness.dark, statusBarIconBrightness: Brightness.light, ), bottom: _scrollRatio.value == 1 ? PreferredSize( - preferredSize: Size.fromHeight(1), + preferredSize: const Size.fromHeight(1), child: Divider( height: 1, color: theme.colorScheme.outline.withOpacity(0.1), @@ -145,7 +145,7 @@ class _SearchTrendingPageState extends State { Widget _buildBody( ThemeData theme, LoadingState?> loadingState) { return switch (loadingState) { - Loading() => SliverToBoxAdapter(child: LinearProgressIndicator()), + Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), Success() => loadingState.response?.isNotEmpty == true ? SliverPadding( padding: EdgeInsets.only( @@ -165,10 +165,10 @@ class _SearchTrendingPageState extends State { ); }, leading: index < _controller.topCount - ? Icon( + ? const Icon( size: 17, Icons.vertical_align_top_outlined, - color: const Color(0xFFd1403e), + color: Color(0xFFd1403e), ) : Text( '${index + 1 - _controller.topCount}', @@ -191,8 +191,8 @@ class _SearchTrendingPageState extends State { item.keyword!, maxLines: 1, overflow: TextOverflow.ellipsis, - strutStyle: StrutStyle(height: 1, leading: 0), - style: TextStyle(height: 1, fontSize: 15), + strutStyle: const StrutStyle(height: 1, leading: 0), + style: const TextStyle(height: 1, fontSize: 15), ), ), if (item.icon?.isNotEmpty == true) ...[ diff --git a/lib/pages/setting/extra_setting.dart b/lib/pages/setting/extra_setting.dart index 3744d617..3161779e 100644 --- a/lib/pages/setting/extra_setting.dart +++ b/lib/pages/setting/extra_setting.dart @@ -9,7 +9,7 @@ class ExtraSetting extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: showAppBar == false ? null : AppBar(title: Text('其它设置')), + appBar: showAppBar == false ? null : AppBar(title: const Text('其它设置')), body: ListView( children: [ ...extraSettings.map((item) => item.widget), diff --git a/lib/pages/setting/pages/color_select.dart b/lib/pages/setting/pages/color_select.dart index 7ff1a279..b0d18e2a 100644 --- a/lib/pages/setting/pages/color_select.dart +++ b/lib/pages/setting/pages/color_select.dart @@ -121,7 +121,7 @@ class _ColorSelectPageState extends State { ? theme.colorScheme.outline.withOpacity(0.8) : theme.colorScheme.secondary, ), - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: const StrutStyle(leading: 0, height: 1), ), Icon( size: 20, @@ -138,11 +138,11 @@ class _ColorSelectPageState extends State { leading: Container( width: 40, alignment: Alignment.center, - child: Icon(Icons.palette_outlined), + child: const Icon(Icons.palette_outlined), ), subtitle: Text( _dynamicSchemeVariant.description, - style: TextStyle(fontSize: 12), + style: const TextStyle(fontSize: 12), ), ), ), @@ -202,7 +202,8 @@ class _ColorSelectPageState extends State { height: 46, decoration: BoxDecoration( color: e['color'].withOpacity(0.8), - borderRadius: BorderRadius.circular(50), + borderRadius: const BorderRadius.all( + Radius.circular(50)), border: Border.all( width: 2, color: ctr.currentColor.value == index diff --git a/lib/pages/setting/pages/display_mode.dart b/lib/pages/setting/pages/display_mode.dart index 4dd259ee..084c1758 100644 --- a/lib/pages/setting/pages/display_mode.dart +++ b/lib/pages/setting/pages/display_mode.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; @@ -39,8 +38,9 @@ class _SetDisplayModeState extends State { @override void dispose() { - controller.removeListener(listener); - controller.dispose(); + controller + ..removeListener(listener) + ..dispose(); super.dispose(); } diff --git a/lib/pages/setting/pages/font_size_select.dart b/lib/pages/setting/pages/font_size_select.dart index 8277d69d..9e366da3 100644 --- a/lib/pages/setting/pages/font_size_select.dart +++ b/lib/pages/setting/pages/font_size_select.dart @@ -27,10 +27,11 @@ class _FontSizeSelectPageState extends State { setting.get(SettingBoxKey.defaultTextScale, defaultValue: 1.0); } - setFontSize() { + void setFontSize() { setting.put(SettingBoxKey.defaultTextScale, currentSize); - Get.back(result: currentSize); - Get.forceAppUpdate(); + Get + ..back(result: currentSize) + ..forceAppUpdate(); } @override @@ -62,7 +63,7 @@ class _FontSizeSelectPageState extends State { ), Container( width: double.infinity, - padding: EdgeInsets.all(20), + padding: const EdgeInsets.all(20), decoration: BoxDecoration( border: Border( top: BorderSide( diff --git a/lib/pages/setting/pages/logs.dart b/lib/pages/setting/pages/logs.dart index a2c8d49f..7a6cc5bb 100644 --- a/lib/pages/setting/pages/logs.dart +++ b/lib/pages/setting/pages/logs.dart @@ -27,14 +27,14 @@ class _LogsPageState extends State { @override void dispose() { if (latestLog != null) { - if (DateTime.now().difference(latestLog!) >= Duration(days: 14)) { + if (DateTime.now().difference(latestLog!) >= const Duration(days: 14)) { clearLogs(); } } super.dispose(); } - void getPath() async { + Future getPath() async { logsPath = await getLogsPath(); fileContent = await logsPath.readAsString(); logsContent = await parseLogs(fileContent); @@ -82,7 +82,7 @@ class _LogsPageState extends State { return result.reversed.toList(); } - void copyLogs() async { + Future copyLogs() async { await Utils.copyText('```\n$fileContent\n```', needToast: false); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( @@ -91,7 +91,7 @@ class _LogsPageState extends State { } } - void clearLogsHandle() async { + Future clearLogsHandle() async { if (await clearLogs()) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( @@ -174,8 +174,7 @@ class _LogsPageState extends State { TextButton.icon( style: TextButton.styleFrom( tapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ), onPressed: () async { await Utils.copyText('```\n${log['body']}\n```', diff --git a/lib/pages/setting/pages/play_speed_set.dart b/lib/pages/setting/pages/play_speed_set.dart index 2f59ac8b..71d9d4ff 100644 --- a/lib/pages/setting/pages/play_speed_set.dart +++ b/lib/pages/setting/pages/play_speed_set.dart @@ -85,11 +85,12 @@ class _PlaySpeedPageState extends State { const SizedBox(height: 12), TextField( autofocus: true, - keyboardType: TextInputType.numberWithOptions(decimal: true), - decoration: InputDecoration( + keyboardType: + const TextInputType.numberWithOptions(decimal: true), + decoration: const InputDecoration( labelText: '自定义倍速', border: OutlineInputBorder( - borderRadius: BorderRadius.circular(6.0), + borderRadius: BorderRadius.all(Radius.circular(6)), ), ), onChanged: (value) { @@ -114,8 +115,9 @@ class _PlaySpeedPageState extends State { SmartDialog.showToast('该倍速已存在'); } else { Get.back(); - speedList.add(customSpeed!); - speedList.sort(); + speedList + ..add(customSpeed!) + ..sort(); await video.put(VideoBoxKey.speedsList, speedList); setState(() {}); } @@ -166,7 +168,7 @@ class _PlaySpeedPageState extends State { } // - void menuAction(index, id) async { + Future menuAction(index, id) async { double speed = speedList[index]; // 设置 if (id == 1) { @@ -205,7 +207,7 @@ class _PlaySpeedPageState extends State { speedList = GStorage.speedList; setState(() {}); }, - child: Text('重置'), + child: const Text('重置'), ), const SizedBox(width: 16), ], diff --git a/lib/pages/setting/slide_color_picker.dart b/lib/pages/setting/slide_color_picker.dart index d8c713b0..8b305fcb 100644 --- a/lib/pages/setting/slide_color_picker.dart +++ b/lib/pages/setting/slide_color_picker.dart @@ -89,10 +89,10 @@ class _SlideColorPickerState extends State { FilteringTextInputFormatter.allow(RegExp('[0-9a-fA-F]')), ], controller: _textController, - decoration: InputDecoration( + decoration: const InputDecoration( isDense: true, prefixText: '#', - contentPadding: const EdgeInsets.all(0), + contentPadding: EdgeInsets.zero, ), onChanged: (value) { _textController.text = value.toUpperCase(); @@ -147,9 +147,7 @@ class _SlideColorPickerState extends State { Get.back(); widget.callback(null); }, - child: Text( - '重置', - ), + child: const Text('重置'), ), ], const Spacer(), diff --git a/lib/pages/setting/style_setting.dart b/lib/pages/setting/style_setting.dart index 0151f021..160319c9 100644 --- a/lib/pages/setting/style_setting.dart +++ b/lib/pages/setting/style_setting.dart @@ -9,7 +9,7 @@ class StyleSetting extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: showAppBar == false ? null : AppBar(title: Text('外观设置')), + appBar: showAppBar == false ? null : AppBar(title: const Text('外观设置')), body: ListView( children: [ ...styleSettings.map((item) => item.widget), diff --git a/lib/pages/setting/view.dart b/lib/pages/setting/view.dart index 646ac9d2..cba858cc 100644 --- a/lib/pages/setting/view.dart +++ b/lib/pages/setting/view.dart @@ -16,7 +16,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -import 'widgets/multi_select_dialog.dart'; +import 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart'; class _SettingsModel { final String name; @@ -45,37 +45,37 @@ class _SettingPageState extends State { bool get _isPortrait => context.orientation == Orientation.portrait; final List<_SettingsModel> _items = [ - _SettingsModel( + const _SettingsModel( name: 'privacySetting', title: '隐私设置', subtitle: '黑名单、无痕模式', icon: Icons.privacy_tip_outlined, ), - _SettingsModel( + const _SettingsModel( name: 'recommendSetting', title: '推荐流设置', subtitle: '推荐来源(web/app)、刷新保留内容、过滤器', icon: Icons.explore_outlined, ), - _SettingsModel( + const _SettingsModel( name: 'videoSetting', title: '音视频设置', subtitle: '画质、音质、解码、缓冲、音频输出等', icon: Icons.video_settings_outlined, ), - _SettingsModel( + const _SettingsModel( name: 'playSetting', title: '播放器设置', subtitle: '双击/长按、全屏、后台播放、弹幕、字幕、底部进度条等', icon: Icons.touch_app_outlined, ), - _SettingsModel( + const _SettingsModel( name: 'styleSetting', title: '外观设置', subtitle: '横屏适配(平板)、侧栏、列宽、首页、动态红点、主题、字号、图片、帧率等', icon: Icons.style_outlined, ), - _SettingsModel( + const _SettingsModel( name: 'extraSetting', title: '其它设置', subtitle: '震动、搜索、收藏、ai、评论、动态、代理、更新检查等', @@ -86,7 +86,7 @@ class _SettingPageState extends State { title: 'WebDAV 设置', icon: MdiIcons.databaseCogOutline, ), - _SettingsModel( + const _SettingsModel( name: 'about', title: '关于', icon: Icons.info_outline, @@ -137,14 +137,17 @@ class _SettingPageState extends State { removeLeft: true, removeTop: true, child: switch (_type) { - 'privacySetting' => PrivacySetting(showAppBar: false), - 'recommendSetting' => RecommendSetting(showAppBar: false), - 'videoSetting' => VideoSetting(showAppBar: false), - 'playSetting' => PlaySetting(showAppBar: false), - 'styleSetting' => StyleSetting(showAppBar: false), - 'extraSetting' => ExtraSetting(showAppBar: false), - 'webdavSetting' => WebDavSettingPage(showAppBar: false), - 'about' => AboutPage(showAppBar: false), + 'privacySetting' => + const PrivacySetting(showAppBar: false), + 'recommendSetting' => + const RecommendSetting(showAppBar: false), + 'videoSetting' => const VideoSetting(showAppBar: false), + 'playSetting' => const PlaySetting(showAppBar: false), + 'styleSetting' => const StyleSetting(showAppBar: false), + 'extraSetting' => const ExtraSetting(showAppBar: false), + 'webdavSetting' => + const WebDavSettingPage(showAppBar: false), + 'about' => const AboutPage(showAppBar: false), _ => const SizedBox.shrink(), }, ), @@ -220,7 +223,7 @@ class _SettingPageState extends State { builder: (context) { return MultiSelectDialog( title: '选择要登出的账号uid', - initValues: Iterable.empty(), + initValues: const Iterable.empty(), values: {for (var i in Accounts.account.values) i: i.mid.toString()}, ); }, @@ -287,11 +290,11 @@ class _SettingPageState extends State { ), child: InkWell( onTap: () => Get.toNamed('/settingsSearch'), - borderRadius: BorderRadius.circular(50), + borderRadius: const BorderRadius.all(Radius.circular(50)), child: Ink( padding: const EdgeInsets.symmetric(vertical: 6), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50), + borderRadius: const BorderRadius.all(Radius.circular(50)), color: theme.colorScheme.onInverseSurface, ), child: Center( diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index 0e3f77b4..6b283d0f 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -31,6 +31,7 @@ import 'package:PiliPlus/pages/setting/widgets/normal_item.dart'; import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart'; import 'package:PiliPlus/pages/setting/widgets/slide_dialog.dart'; import 'package:PiliPlus/pages/setting/widgets/switch_item.dart'; +import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart'; import 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart'; import 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; @@ -332,9 +333,8 @@ List get styleSettings => [ }, ); if (result != null) { - MainController mainController = Get.put(MainController()); - mainController.dynamicBadgeMode = - DynamicBadgeMode.values[result.index]; + MainController mainController = Get.put(MainController()) + ..dynamicBadgeMode = DynamicBadgeMode.values[result.index]; if (mainController.dynamicBadgeMode != DynamicBadgeMode.hidden) { mainController.getUnreadDynamic(); } @@ -364,8 +364,8 @@ List get styleSettings => [ }, ); if (result != null) { - MainController mainController = Get.put(MainController()); - mainController.msgBadgeMode = DynamicBadgeMode.values[result.index]; + MainController mainController = Get.put(MainController()) + ..msgBadgeMode = DynamicBadgeMode.values[result.index]; if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) { mainController.queryUnreadMsg(); } else { @@ -395,8 +395,8 @@ List get styleSettings => [ }, ); if (result != null) { - MainController mainController = Get.put(MainController()); - mainController.msgUnReadTypes = result; + MainController mainController = Get.put(MainController()) + ..msgUnReadTypes = result; if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) { mainController.queryUnreadMsg(); } @@ -624,7 +624,7 @@ List get styleSettings => [ autofocus: index == 0, initialValue: springDescription[index], keyboardType: - TextInputType.numberWithOptions(decimal: true), + const TextInputType.numberWithOptions(decimal: true), onChanged: (value) { springDescription[index] = value; }, @@ -929,7 +929,7 @@ List get playSettings => [ title: '默认全屏方向', leading: const Icon(Icons.open_with_outlined), getSubtitle: () => - '当前全屏方向:${FullScreenModeCode.fromCode(GStorage.defaultFullScreenMode)!.description}', + '当前全屏方向:${FullScreenModeCode.fromCode(GStorage.defaultFullScreenMode).description}', onTap: (setState) async { int? result = await showDialog( context: Get.context!, @@ -953,7 +953,7 @@ List get playSettings => [ title: '底部进度条展示', leading: const Icon(Icons.border_bottom_outlined), getSubtitle: () => - '当前展示方式:${BtmProgresBehaviorCode.fromCode(GStorage.defaultBtmProgressBehavior)!.description}', + '当前展示方式:${BtmProgresBehaviorCode.fromCode(GStorage.defaultBtmProgressBehavior).description}', onTap: (setState) async { int? result = await showDialog( context: Get.context!, @@ -1031,7 +1031,7 @@ List get videoSettings => [ String? result = await showDialog( context: Get.context!, builder: (context) { - return CdnSelectDialog(); + return const CdnSelectDialog(); }, ); if (result != null) { @@ -1377,8 +1377,8 @@ List get recommendSettings => [ defaultVal: true, onChanged: (value) { try { - RcmdController ctr = Get.find(); - ctr.savedRcmdTip = value; + RcmdController ctr = Get.find() + ..savedRcmdTip = value; if (value.not) { ctr.lastRefreshAt = null; } @@ -1537,14 +1537,14 @@ List get extraSettings => [ content: TextFormField( autofocus: true, initialValue: dynamicPeriod.toString(), - keyboardType: TextInputType.numberWithOptions(), + keyboardType: TextInputType.number, onChanged: (value) { dynamicPeriod = int.tryParse(value) ?? 5; }, inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'\d+')), ], - decoration: InputDecoration(suffixText: 'min'), + decoration: const InputDecoration(suffixText: 'min'), ), actions: [ TextButton( @@ -1650,14 +1650,14 @@ List get extraSettings => [ content: TextFormField( autofocus: true, initialValue: replyLengthLimit, - keyboardType: TextInputType.numberWithOptions(), + keyboardType: TextInputType.number, onChanged: (value) { replyLengthLimit = value; }, inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'\d+')), ], - decoration: InputDecoration(suffixText: '行'), + decoration: const InputDecoration(suffixText: '行'), ), actions: [ TextButton( @@ -1708,7 +1708,8 @@ List get extraSettings => [ content: TextFormField( autofocus: true, initialValue: danmakuLineHeight, - keyboardType: TextInputType.numberWithOptions(decimal: true), + keyboardType: + const TextInputType.numberWithOptions(decimal: true), onChanged: (value) { danmakuLineHeight = value; }, @@ -2078,7 +2079,7 @@ List get extraSettings => [ settingsType: SettingsType.sw1tch, title: '使用「哔哩发评反诈」检查评论', subtitle: '仅对Android生效', - leading: Icon( + leading: const Icon( FontAwesomeIcons.b, size: 22, ), @@ -2185,6 +2186,7 @@ List get extraSettings => [ enableFeedback: true, setKey: SettingBoxKey.feedBackEnable, onChanged: (value) { + enableFeedback = value; feedBack(); }, leading: const Icon(Icons.vibration_outlined), @@ -2233,6 +2235,9 @@ List get extraSettings => [ leading: const Icon(Icons.search_outlined), setKey: SettingBoxKey.enableWordRe, defaultVal: false, + onChanged: (value) { + ReplyItemGrpc.enableWordRe = value; + }, ), SettingsModel( settingsType: SettingsType.sw1tch, @@ -2418,8 +2423,8 @@ List get extraSettings => [ labelText: systemProxyHost != '' ? systemProxyHost : '请输入Host,使用 . 分割', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(6.0), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: systemProxyHost, ), @@ -2434,8 +2439,8 @@ List get extraSettings => [ isDense: true, labelText: systemProxyPort != '' ? systemProxyPort : '请输入Port', - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(6.0), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: systemProxyPort, ), @@ -2503,7 +2508,7 @@ List get extraSettings => [ inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[\d\.]+')), ], - decoration: InputDecoration(suffixText: 'MB'), + decoration: const InputDecoration(suffixText: 'MB'), ), actions: [ TextButton( diff --git a/lib/pages/setting/widgets/multi_select_dialog.dart b/lib/pages/setting/widgets/multi_select_dialog.dart index 351e1b2b..62b12f92 100644 --- a/lib/pages/setting/widgets/multi_select_dialog.dart +++ b/lib/pages/setting/widgets/multi_select_dialog.dart @@ -57,7 +57,7 @@ class _MultiSelectDialogState extends State> { ), ); }), - actionsPadding: EdgeInsets.only(left: 16, right: 16, bottom: 12), + actionsPadding: const EdgeInsets.only(left: 16, right: 16, bottom: 12), actions: [ TextButton( onPressed: Get.back, diff --git a/lib/pages/setting/widgets/switch_item.dart b/lib/pages/setting/widgets/switch_item.dart index 0d391265..87c0bc79 100644 --- a/lib/pages/setting/widgets/switch_item.dart +++ b/lib/pages/setting/widgets/switch_item.dart @@ -59,7 +59,7 @@ class _SetSwitchItemState extends State { setVal(); } - void switchChange(ThemeData theme, value) async { + Future switchChange(ThemeData theme, value) async { if (widget.setKey == SettingBoxKey.badCertificateCallback && (value ?? !val)) { showDialog( diff --git a/lib/pages/settings_search/view.dart b/lib/pages/settings_search/view.dart index 5d2a5e8a..d0d0f200 100644 --- a/lib/pages/settings_search/view.dart +++ b/lib/pages/settings_search/view.dart @@ -70,7 +70,7 @@ class _SettingsSearchPageState extends State { } }); }, - decoration: InputDecoration( + decoration: const InputDecoration( isDense: true, hintText: '搜索', border: InputBorder.none, @@ -83,7 +83,7 @@ class _SettingsSearchPageState extends State { slivers: [ Obx( () => _list.isEmpty - ? HttpError() + ? const HttpError() : SliverPadding( padding: EdgeInsets.only( bottom: MediaQuery.paddingOf(context).bottom + 80, diff --git a/lib/pages/share/view.dart b/lib/pages/share/view.dart index ae8b788d..9106eca2 100644 --- a/lib/pages/share/view.dart +++ b/lib/pages/share/view.dart @@ -85,7 +85,7 @@ class _SharePanelState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('分享给'), + const Text('分享给'), iconButton( size: 32, iconSize: 18, @@ -133,7 +133,7 @@ class _SharePanelState extends State { _userList[index].name, maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 12), + style: const TextStyle(fontSize: 12), ), ], ), @@ -150,7 +150,7 @@ class _SharePanelState extends State { color: theme.colorScheme.primary, ), ), - child: Icon( + child: const Icon( Icons.check, size: 20, color: Colors.white, @@ -172,8 +172,9 @@ class _SharePanelState extends State { transitionDuration: const Duration(milliseconds: 120), ); if (userModel != null) { - _userList.remove(userModel); - _userList.insert(0, userModel); + _userList + ..remove(userModel) + ..insert(0, userModel); _selectedIndex = 0; _scrollController.jumpToTop(); setState(() {}); @@ -222,9 +223,9 @@ class _SharePanelState extends State { decoration: InputDecoration( hintText: '说说你的想法吧...', hintStyle: const TextStyle(fontSize: 14), - border: OutlineInputBorder( + border: const OutlineInputBorder( borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(20), + borderRadius: BorderRadius.all(Radius.circular(20)), ), filled: true, isDense: true, diff --git a/lib/pages/sponsor_block/view.dart b/lib/pages/sponsor_block/view.dart index e11ec122..1aa4436e 100644 --- a/lib/pages/sponsor_block/view.dart +++ b/lib/pages/sponsor_block/view.dart @@ -56,7 +56,7 @@ class _SponsorBlockPageState extends State { super.dispose(); } - _checkServerStatus() { + void _checkServerStatus() { Request() .get( '$_blockServer/api/status/uptime', @@ -84,10 +84,11 @@ class _SponsorBlockPageState extends State { return AlertDialog( title: Text('最短片段时长', style: titleStyle), content: TextFormField( - keyboardType: TextInputType.numberWithOptions(decimal: true), + keyboardType: + const TextInputType.numberWithOptions(decimal: true), controller: _textController, autofocus: true, - decoration: InputDecoration(suffixText: 's'), + decoration: const InputDecoration(suffixText: 's'), inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[\d\.]+')), ], @@ -110,7 +111,7 @@ class _SponsorBlockPageState extends State { await setting.put(SettingBoxKey.blockLimit, _blockLimit); setState(() {}); }, - child: Text('确定'), + child: const Text('确定'), ) ], ); @@ -124,7 +125,7 @@ class _SponsorBlockPageState extends State { ), trailing: Text( '${_blockLimit}s', - style: TextStyle(fontSize: 13), + style: const TextStyle(fontSize: 13), ), ); @@ -171,11 +172,11 @@ class _SponsorBlockPageState extends State { TextButton( onPressed: () async { Get.back(); - _userId = Uuid().v4().replaceAll('-', ''); + _userId = const Uuid().v4().replaceAll('-', ''); await setting.put(SettingBoxKey.blockUserID, _userId); setState(() {}); }, - child: Text('随机'), + child: const Text('随机'), ), TextButton( onPressed: Get.back, @@ -195,7 +196,7 @@ class _SponsorBlockPageState extends State { setState(() {}); } }, - child: Text('确定'), + child: const Text('确定'), ) ], ); @@ -204,13 +205,13 @@ class _SponsorBlockPageState extends State { }, ); - void _updateBlockToast() async { + Future _updateBlockToast() async { _blockToast = !_blockToast; await setting.put(SettingBoxKey.blockToast, _blockToast); setState(() {}); } - void _updateBlockTrack() async { + Future _updateBlockTrack() async { _blockTrack = !_blockTrack; await setting.put(SettingBoxKey.blockTrack, _blockTrack); setState(() {}); @@ -296,7 +297,7 @@ class _SponsorBlockPageState extends State { Request.accountManager.blockServer = _blockServer; setState(() {}); }, - child: Text('重置'), + child: const Text('重置'), ), TextButton( onPressed: Get.back, @@ -316,7 +317,7 @@ class _SponsorBlockPageState extends State { Request.accountManager.blockServer = _blockServer; setState(() {}); }, - child: Text('确定'), + child: const Text('确定'), ) ], ); @@ -361,7 +362,7 @@ class _SponsorBlockPageState extends State { Widget build(BuildContext context) { final theme = Theme.of(context); - final titleStyle = TextStyle(fontSize: 15); + const titleStyle = TextStyle(fontSize: 15); final subTitleStyle = TextStyle( fontSize: 13, @@ -383,7 +384,7 @@ class _SponsorBlockPageState extends State { ); return Scaffold( - appBar: AppBar(title: Text('空降助手')), + appBar: AppBar(title: const Text('空降助手')), body: CustomScrollView( slivers: [ dividerL, @@ -410,7 +411,7 @@ class _SponsorBlockPageState extends State { title: Text.rich( TextSpan( children: [ - TextSpan( + const TextSpan( text: 'Color Picker ', style: TextStyle(fontSize: 15), ), @@ -424,11 +425,11 @@ class _SponsorBlockPageState extends State { color: _blockColor[index], ), ), - style: TextStyle(fontSize: 13, height: 1), + style: const TextStyle(fontSize: 13, height: 1), ), TextSpan( text: ' ${_blockSettings[index].first.title}', - style: TextStyle(fontSize: 13, height: 1), + style: const TextStyle(fontSize: 13, height: 1), ), ], ), @@ -466,11 +467,11 @@ class _SponsorBlockPageState extends State { color: _blockColor[index], ), ), - style: TextStyle(fontSize: 14, height: 1), + style: const TextStyle(fontSize: 14, height: 1), ), TextSpan( text: ' ${_blockSettings[index].first.title}', - style: TextStyle(fontSize: 14, height: 1), + style: const TextStyle(fontSize: 14, height: 1), ), ], ), @@ -507,7 +508,7 @@ class _SponsorBlockPageState extends State { ? theme.colorScheme.outline.withOpacity(0.7) : theme.colorScheme.secondary, ), - strutStyle: StrutStyle(height: 1, leading: 0), + strutStyle: const StrutStyle(height: 1, leading: 0), ), Icon( MdiIcons.unfoldMoreHorizontal, diff --git a/lib/pages/subscription/view.dart b/lib/pages/subscription/view.dart index 4b5f3624..466add3b 100644 --- a/lib/pages/subscription/view.dart +++ b/lib/pages/subscription/view.dart @@ -7,7 +7,7 @@ import 'package:PiliPlus/utils/grid.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/subscription/controller.dart'; class SubPage extends StatefulWidget { const SubPage({super.key}); diff --git a/lib/pages/subscription/widgets/item.dart b/lib/pages/subscription/widgets/item.dart index 60f76081..d94d9e38 100644 --- a/lib/pages/subscription/widgets/item.dart +++ b/lib/pages/subscription/widgets/item.dart @@ -117,7 +117,7 @@ class SubItem extends StatelessWidget { onPressed: () => cancelSub(subFolderItem), style: TextButton.styleFrom( foregroundColor: theme.colorScheme.outline, - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + padding: EdgeInsets.zero, ), icon: const Icon(Icons.delete_outline, size: 18), ), diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 8472a72a..d189894f 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -76,9 +76,6 @@ class VideoDetailController extends GetxController RxBool autoPlay = true.obs; // 封面图的展示 RxBool isShowCover = true.obs; - // 硬解 - RxBool enableHA = true.obs; - RxString hwdec = GStorage.hardwareDecoding.obs; RxInt oid = 0.obs; @@ -96,32 +93,22 @@ class VideoDetailController extends GetxController Duration? playedTime; // 亮度 double? brightness; - // 默认记录历史记录 - bool enableHeart = true; + Floating? floating; late final headerCtrKey = GlobalKey(); Box get setting => GStorage.setting; - int? cacheVideoQa; late String cacheDecode; late String cacheSecondDecode; - late int cacheAudioQa; - late final showRelatedVideo = GStorage.showRelatedVideo; + bool get showReply => videoType == SearchType.video + ? plPlayerController.showVideoReply + : plPlayerController.showBangumiReply; - late final _showVideoReply = GStorage.showVideoReply; - late final _showBangumiReply = GStorage.showBangumiReply; - bool get showReply => - videoType == SearchType.video ? _showVideoReply : _showBangumiReply; - - late final preInitPlayer = GStorage.preInitPlayer; - late final horizontalSeasonPanel = GStorage.horizontalSeasonPanel; int? seasonCid; late RxInt seasonIndex = 0.obs; - late final reverseFromFirst = GStorage.reverseFromFirst; - late final bool enableSponsorBlock; PlayerStatus? playerStatus; StreamSubscription? positionSubscription; @@ -224,14 +211,13 @@ class VideoDetailController extends GetxController imageStatus = false; } - late final horizontalPreview = GStorage.horizontalPreview; - // 页面来源 稍后再看 收藏夹 String sourceType = 'normal'; late bool _mediaDesc = false; late RxList mediaList = [].obs; late String watchLaterTitle = ''; - bool get isPlayAll => ['watchLater', 'fav', 'archive'].contains(sourceType); + bool get isPlayAll => + const ['watchLater', 'fav', 'archive'].contains(sourceType); int get _mediaType => switch (sourceType) { 'archive' => 1, 'watchLater' => 2, @@ -278,11 +264,6 @@ class VideoDetailController extends GetxController autoPlay.value = setting.get(SettingBoxKey.autoPlayEnable, defaultValue: false); if (autoPlay.value) isShowCover.value = false; - enableHA.value = setting.get(SettingBoxKey.enableHA, defaultValue: true); - if (!Accounts.get(AccountType.heartbeat).isLogin || - GStorage.localCache.get(LocalCacheKey.historyPause) == true) { - enableHeart = false; - } danmakuCid.value = cid.value; if (Platform.isAndroid) { @@ -295,16 +276,9 @@ class VideoDetailController extends GetxController cacheSecondDecode = setting.get(SettingBoxKey.secondDecode, defaultValue: VideoDecodeFormats.values[1].code); oid.value = IdUtils.bv2av(Get.parameters['bvid']!); - enableSponsorBlock = - setting.get(SettingBoxKey.enableSponsorBlock, defaultValue: false); - if (enableSponsorBlock) { - _blockLimit = GStorage.blockLimit; - _blockSettings = GStorage.blockSettings; - _blockColor = GStorage.blockColor; - } } - void getMediaList({ + Future getMediaList({ bool isReverse = false, bool isLoadPrevious = false, }) async { @@ -373,7 +347,7 @@ class VideoDetailController extends GetxController } // 稍后再看面板展开 - showMediaListPanel(context) { + void showMediaListPanel(context) { if (mediaList.isNotEmpty) { Widget panel() => MediaListPanel( mediaList: mediaList, @@ -446,22 +420,19 @@ class VideoDetailController extends GetxController } } - bool horizontalScreen = - GStorage.setting.get(SettingBoxKey.horizontalScreen, defaultValue: false); + bool get horizontalScreen => plPlayerController.horizontalScreen; bool get showVideoSheet => !horizontalScreen && Get.context!.orientation == Orientation.landscape; int? _lastPos; - double? _blockLimit; - List>? _blockSettings; - List? _blockColor; + List? postList; RxList segmentList = [].obs; List viewPointList = []; List? segmentProgressList; Color _getColor(SegmentType segment) => - _blockColor?[segment.index] ?? segment.color; + plPlayerController.blockColor[segment.index]; late RxString videoLabel = ''.obs; - late final blockServer = GStorage.blockServer; + String get blockServer => plPlayerController.blockServer; Timer? skipTimer; late final listKey = GlobalKey(); @@ -519,11 +490,11 @@ class VideoDetailController extends GetxController color: _getColor(item), ), ), - style: TextStyle(fontSize: 14, height: 1), + style: const TextStyle(fontSize: 14, height: 1), ), TextSpan( text: ' ${item.title}', - style: TextStyle(fontSize: 14, height: 1), + style: const TextStyle(fontSize: 14, height: 1), ), ], ), @@ -548,7 +519,7 @@ class VideoDetailController extends GetxController children: [ ListTile( dense: true, - title: Text( + title: const Text( '赞成票', style: TextStyle(fontSize: 14), ), @@ -559,7 +530,7 @@ class VideoDetailController extends GetxController ), ListTile( dense: true, - title: Text( + title: const Text( '反对票', style: TextStyle(fontSize: 14), ), @@ -570,7 +541,7 @@ class VideoDetailController extends GetxController ), ListTile( dense: true, - title: Text( + title: const Text( '更改类别', style: TextStyle(fontSize: 14), ), @@ -616,26 +587,26 @@ class VideoDetailController extends GetxController color: _getColor(item.segmentType), ), ), - style: TextStyle(fontSize: 14, height: 1), + style: const TextStyle(fontSize: 14, height: 1), ), TextSpan( text: ' ${item.segmentType.title}', - style: TextStyle(fontSize: 14, height: 1), + style: const TextStyle(fontSize: 14, height: 1), ), ], ), ), - contentPadding: EdgeInsets.only(left: 16, right: 8), + contentPadding: const EdgeInsets.only(left: 16, right: 8), subtitle: Text( '${Utils.formatDuration(item.segment.first)} 至 ${Utils.formatDuration(item.segment.second)}', - style: TextStyle(fontSize: 13), + style: const TextStyle(fontSize: 13), ), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ Text( item.skipType.title, - style: TextStyle(fontSize: 13), + style: const TextStyle(fontSize: 13), ), if (item.segment.second != 0) SizedBox( @@ -684,8 +655,9 @@ class VideoDetailController extends GetxController void _showBlockToast(String msg) { SmartDialog.showToast( msg, - alignment: - plPlayerController.isFullScreen.value ? Alignment(0, 0.7) : null, + alignment: plPlayerController.isFullScreen.value + ? const Alignment(0, 0.7) + : null, ); } @@ -709,31 +681,25 @@ class VideoDetailController extends GetxController void handleSBData(result) { if (result.data is List && result.data.isNotEmpty) { try { - List list = - SegmentType.values.map((item) => item.name).toList(); - List enableList = _blockSettings! - .where((item) => item.second != SkipType.disable) - .toList() - .map((item) => item.first.name) - .toList(); - // segmentList segmentList.addAll((result.data as List) .where((item) => - enableList.contains(item['category']) && + plPlayerController.enableList.contains(item['category']) && item['segment'][1] >= item['segment'][0]) .map( (item) { - SegmentType segmentType = - SegmentType.values[list.indexOf(item['category'])]; + SegmentType segmentType = SegmentType.values[ + plPlayerController.segmentTypes.indexOf(item['category'])]; if (item['segment'][0] == 0 && item['segment'][1] == 0) { videoLabel.value += '${videoLabel.value.isNotEmpty ? '/' : ''}${segmentType.title}'; } - SkipType skipType = _blockSettings![segmentType.index].second; + SkipType skipType = + plPlayerController.blockSettings[segmentType.index].second; if (skipType != SkipType.showOnly) { if (item['segment'][1] == item['segment'][0] || - item['segment'][1] - item['segment'][0] < _blockLimit) { + item['segment'][1] - item['segment'][0] < + plPlayerController.blockLimit) { skipType = SkipType.showOnly; } } @@ -796,7 +762,7 @@ class VideoDetailController extends GetxController }).toList()); if (positionSubscription == null && - (!isShowCover.value || preInitPlayer)) { + (!isShowCover.value || plPlayerController.preInitPlayer)) { initSkip(); plPlayerController.segmentList.value = segmentProgressList!; } @@ -872,8 +838,8 @@ class VideoDetailController extends GetxController alignment: Alignment.centerLeft, child: SlideTransition( position: Tween( - begin: Offset(-1, 0), - end: Offset(0, 0), + begin: const Offset(-1, 0), + end: Offset.zero, ).animate(animation), child: Padding( padding: const EdgeInsets.only(top: 5), @@ -927,7 +893,7 @@ class VideoDetailController extends GetxController ); } - void onSkip(SegmentModel item, [bool isSkip = true]) async { + Future onSkip(SegmentModel item, [bool isSkip = true]) async { try { plPlayerController.danmakuController?.clear(); await plPlayerController.videoPlayerController @@ -959,7 +925,7 @@ class VideoDetailController extends GetxController String? savedDanmaku; /// 发送弹幕 - void showShootDanmakuSheet() async { + Future showShootDanmakuSheet() async { bool isPlaying = plPlayerController.playerStatus.status.value == PlayerStatus.playing; if (isPlaying) { @@ -1005,7 +971,7 @@ class VideoDetailController extends GetxController } /// 更新画质、音质 - updatePlayer() { + void updatePlayer() { isShowCover.value = false; playedTime = plPlayerController.position.value; plPlayerController.removeListeners(); @@ -1109,9 +1075,6 @@ class VideoDetailController extends GetxController viewPointList: viewPointList, showVP: showVP, dmTrend: dmTrend, - // 硬解 - enableHA: enableHA.value, - hwdec: hwdec.value, seekTo: seekToTime ?? defaultST ?? playedTime, duration: duration ?? data.timeLength == null ? null @@ -1120,7 +1083,6 @@ class VideoDetailController extends GetxController direction: direction.value, bvid: bvid, cid: cid.value, - enableHeart: enableHeart, autoplay: autoplay ?? autoPlay.value, epid: videoType == SearchType.media_bangumi ? epId : null, seasonId: videoType == SearchType.media_bangumi ? seasonId : null, @@ -1139,7 +1101,7 @@ class VideoDetailController extends GetxController _getSubtitle(); } - if (showDmChart && dmTrend == null) { + if (plPlayerController.showDmChart && dmTrend == null) { _getDmTrend(); } @@ -1155,19 +1117,19 @@ class VideoDetailController extends GetxController return; } isQuerying = true; - if (cacheVideoQa == null) { + if (plPlayerController.cacheVideoQa == null) { await Connectivity().checkConnectivity().then((res) { - cacheVideoQa = res.contains(ConnectivityResult.wifi) - ? setting.get(SettingBoxKey.defaultVideoQa, - defaultValue: VideoQuality.values.last.code) - : setting.get(SettingBoxKey.defaultVideoQaCellular, - defaultValue: VideoQuality.high1080.code); - - cacheAudioQa = res.contains(ConnectivityResult.wifi) - ? setting.get(SettingBoxKey.defaultAudioQa, - defaultValue: AudioQuality.hiRes.code) - : setting.get(SettingBoxKey.defaultAudioQaCellular, - defaultValue: AudioQuality.k192.code); + plPlayerController + ..cacheVideoQa = res.contains(ConnectivityResult.wifi) + ? setting.get(SettingBoxKey.defaultVideoQa, + defaultValue: VideoQuality.values.last.code) + : setting.get(SettingBoxKey.defaultVideoQaCellular, + defaultValue: VideoQuality.high1080.code) + ..cacheAudioQa = res.contains(ConnectivityResult.wifi) + ? setting.get(SettingBoxKey.defaultAudioQa, + defaultValue: AudioQuality.hiRes.code) + : setting.get(SettingBoxKey.defaultAudioQaCellular, + defaultValue: AudioQuality.k192.code); }); } dynamic result = await VideoHttp.videoUrl( @@ -1180,7 +1142,7 @@ class VideoDetailController extends GetxController if (result['status']) { data = result['data']; - if (enableSponsorBlock) { + if (plPlayerController.enableSponsorBlock) { _querySponsorBlock(); } @@ -1211,7 +1173,7 @@ class VideoDetailController extends GetxController if (autoPlay.value) { isShowCover.value = false; await playerInit(); - } else if (preInitPlayer) { + } else if (plPlayerController.preInitPlayer) { await playerInit(); } isQuerying = false; @@ -1233,13 +1195,13 @@ class VideoDetailController extends GetxController // 当前可播放的最高质量视频 int currentHighVideoQa = allVideosList.first.quality!.code; // 预设的画质为null,则当前可用的最高质量 - cacheVideoQa ??= currentHighVideoQa; int resVideoQa = currentHighVideoQa; - if (cacheVideoQa! <= currentHighVideoQa) { + if (plPlayerController.cacheVideoQa! <= currentHighVideoQa) { // 如果预设的画质低于当前最高 final List numbers = data.acceptQuality!.where((e) => e <= currentHighVideoQa).toList(); - resVideoQa = Utils.findClosestNumber(cacheVideoQa!, numbers); + resVideoQa = + Utils.findClosestNumber(plPlayerController.cacheVideoQa!, numbers); } currentVideoQa = VideoQualityCode.fromCode(resVideoQa)!; @@ -1299,9 +1261,10 @@ class VideoDetailController extends GetxController if (audiosList.isNotEmpty) { final List numbers = audiosList.map((map) => map.id!).toList(); - int closestNumber = Utils.findClosestNumber(cacheAudioQa, numbers); - if (!numbers.contains(cacheAudioQa) && - numbers.any((e) => e > cacheAudioQa)) { + int closestNumber = + Utils.findClosestNumber(plPlayerController.cacheAudioQa, numbers); + if (!numbers.contains(plPlayerController.cacheAudioQa) && + numbers.any((e) => e > plPlayerController.cacheAudioQa)) { closestNumber = 30280; } firstAudio = audiosList.firstWhere((e) => e.id == closestNumber, @@ -1325,7 +1288,7 @@ class VideoDetailController extends GetxController if (autoPlay.value) { isShowCover.value = false; await playerInit(); - } else if (preInitPlayer) { + } else if (plPlayerController.preInitPlayer) { await playerInit(); } } else { @@ -1347,12 +1310,10 @@ class VideoDetailController extends GetxController isQuerying = false; } - List? list; - void onBlock(BuildContext context) { - list ??= []; - if (list!.isEmpty) { - list!.add( + postList ??= []; + if (postList!.isEmpty) { + postList!.add( PostSegmentModel( segment: Pair( first: 0, @@ -1405,7 +1366,7 @@ class VideoDetailController extends GetxController } // 设定字幕轨道 - setSubtitle(int index) async { + Future setSubtitle(int index) async { if (index <= 0) { plPlayerController.videoPlayerController ?.setSubtitleTrack(SubtitleTrack.no()); @@ -1440,7 +1401,7 @@ class VideoDetailController extends GetxController dynamic graphVersion; Map? steinEdgeInfo; late final RxBool showSteinEdgeInfo = false.obs; - void getSteinEdgeInfo([edgeId]) async { + Future getSteinEdgeInfo([edgeId]) async { steinEdgeInfo = null; try { dynamic res = await Request().get( @@ -1553,7 +1514,7 @@ class VideoDetailController extends GetxController } void makeHeartBeat() { - if (enableHeart && + if (plPlayerController.enableHeart && plPlayerController.playerStatus.status.value != PlayerStatus.completed && playedTime != null) { @@ -1579,13 +1540,14 @@ class VideoDetailController extends GetxController @override void onClose() { tabCtr.dispose(); - scrollCtr.removeListener(scrollListener); - scrollCtr.dispose; + scrollCtr + ..removeListener(scrollListener) + ..dispose(); animationController.dispose(); super.onClose(); } - onReset([isStein]) { + void onReset([isStein]) { playedTime = null; videoUrl = null; audioUrl = null; @@ -1607,7 +1569,7 @@ class VideoDetailController extends GetxController viewPointList.clear(); // sponsor block - if (enableSponsorBlock) { + if (plPlayerController.enableSponsorBlock) { positionSubscription?.cancel(); positionSubscription = null; videoLabel.value = ''; @@ -1623,10 +1585,9 @@ class VideoDetailController extends GetxController showSteinEdgeInfo.value = false; } - late final showDmChart = GStorage.showDmChart; List? dmTrend; - void _getDmTrend() async { + Future _getDmTrend() async { dmTrend = []; try { dynamic res = await Request().get( @@ -1650,7 +1611,7 @@ class VideoDetailController extends GetxController } } - void showNoteList(BuildContext context) async { + Future showNoteList(BuildContext context) async { String? title; try { title = diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index e24de95a..ee735821 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -144,7 +144,7 @@ class BangumiIntroController } } - void coinVideo(int coin, [bool selectLike = false]) async { + Future coinVideo(int coin, [bool selectLike = false]) async { var res = await VideoHttp.coinVideo( bvid: bvid, multiply: coin, @@ -383,7 +383,7 @@ class BangumiIntroController } // 选择文件夹 - onChoose(bool checkValue, int index) { + void onChoose(bool checkValue, int index) { feedBack(); List datalist = favFolderData.value.list!; datalist[index].favState = checkValue ? 1 : 0; @@ -608,7 +608,7 @@ class BangumiIntroController } // 收藏 - showFavBottomSheet(BuildContext context, {type = 'tap'}) { + void showFavBottomSheet(BuildContext context, {type = 'tap'}) { if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; diff --git a/lib/pages/video/introduction/pgc/view.dart b/lib/pages/video/introduction/pgc/view.dart index db7de4e0..cf0fe956 100644 --- a/lib/pages/video/introduction/pgc/view.dart +++ b/lib/pages/video/introduction/pgc/view.dart @@ -78,7 +78,7 @@ class _BangumiIntroPanelState extends State return Obx(() => _buildBody(bangumiIntroController.loadingState.value)); } - _buildBody(LoadingState loadingState) { + Widget _buildBody(LoadingState loadingState) { return switch (loadingState) { Loading() => BangumiInfo( heroTag: widget.heroTag, @@ -135,7 +135,7 @@ class _BangumiInfoState extends State { late final BangumiInfoModel? bangumiItem; int? cid; bool isProcessing = false; - void handleState(Future Function() action) async { + Future handleState(Future Function() action) async { if (isProcessing.not) { isProcessing = true; await action(); @@ -171,7 +171,7 @@ class _BangumiInfoState extends State { } // 视频介绍 - showIntroDetail() { + void showIntroDetail() { feedBack(); widget.showIntroDetail(); } @@ -275,10 +275,7 @@ class _BangumiInfoState extends State { horizontal: 20, vertical: 10, ), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), + visualDensity: VisualDensity.compact, foregroundColor: bangumiIntroController .isFollowed.value diff --git a/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart b/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart index cbea9813..19f9f7fa 100644 --- a/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart +++ b/lib/pages/video/introduction/pgc/widgets/bangumi_panel.dart @@ -142,7 +142,7 @@ class _BangumiPanelState extends State { ), child: Material( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), clipBehavior: Clip.hardEdge, child: InkWell( onTap: () { diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index f285cc24..8d089b0a 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -147,8 +147,9 @@ class VideoIntroController extends GetxController { } if (videoDetail.value.cid == data.cid) { // keep reversed pages - data.pages = videoDetail.value.pages; - data.isPageReversed = videoDetail.value.isPageReversed; + data + ..pages = videoDetail.value.pages + ..isPageReversed = videoDetail.value.isPageReversed; } videoDetail.value = data; videoItem['staff'] = data.staff; @@ -315,7 +316,7 @@ class VideoIntroController extends GetxController { SmartDialog.showToast(res['msg']); } - void coinVideo(int coin, [bool selectLike = false]) async { + Future coinVideo(int coin, [bool selectLike = false]) async { if (videoDetail.value.stat?.coin == null) { // not init return; @@ -546,7 +547,7 @@ class VideoIntroController extends GetxController { } // 选择文件夹 - onChoose(bool checkValue, int index) { + void onChoose(bool checkValue, int index) { feedBack(); List datalist = favFolderData.value.list!; datalist[index].favState = checkValue ? 1 : 0; @@ -595,6 +596,9 @@ class VideoIntroController extends GetxController { followStatus: followStatus, callback: (attribute) { followStatus['attribute'] = attribute; + Future.delayed(const Duration(milliseconds: 500), () { + queryFollowStatus(); + }); }, ); } @@ -636,7 +640,7 @@ class VideoIntroController extends GetxController { } // 重新请求相关视频 - if (videoDetailCtr.showRelatedVideo) { + if (videoDetailCtr.plPlayerController.showRelatedVideo) { try { Get.find(tag: heroTag) ..bvid = bvid @@ -779,7 +783,7 @@ class VideoIntroController extends GetxController { if (episodes.isEmpty) { if (playRepeat == PlayRepeat.autoPlayRelated && - videoDetailCtr.showRelatedVideo) { + videoDetailCtr.plPlayerController.showRelatedVideo) { return playRelated(); } return false; @@ -811,7 +815,7 @@ class VideoIntroController extends GetxController { if (playRepeat == PlayRepeat.listCycle) { nextIndex = 0; } else if (playRepeat == PlayRepeat.autoPlayRelated && - videoDetailCtr.showRelatedVideo) { + videoDetailCtr.plPlayerController.showRelatedVideo) { return playRelated(); } else { return false; @@ -906,7 +910,7 @@ class VideoIntroController extends GetxController { } // 收藏 - showFavBottomSheet(BuildContext context, {type = 'tap'}) { + void showFavBottomSheet(BuildContext context, {type = 'tap'}) { if (userInfo == null) { SmartDialog.showToast('账号未登录'); return; diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index 4a98d0d1..cfd131b5 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -28,10 +28,10 @@ import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; -import 'widgets/action_item.dart'; -import 'widgets/action_row_item.dart'; -import 'widgets/page.dart'; -import 'widgets/season.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_row_item.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart'; +import 'package:PiliPlus/pages/video/introduction/ugc/widgets/season.dart'; class VideoIntroPanel extends StatefulWidget { const VideoIntroPanel({ @@ -129,7 +129,7 @@ class _VideoInfoState extends State { late final _horizontalMemberPage = GStorage.horizontalMemberPage; Widget _buildVideoTitle(ThemeData theme, [bool isExpand = false]) => - videoDetailCtr.enableSponsorBlock + videoDetailCtr.plPlayerController.enableSponsorBlock ? Obx( () => Text.rich( TextSpan( @@ -144,7 +144,8 @@ class _VideoInfoState extends State { ), decoration: BoxDecoration( color: theme.colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(4), + borderRadius: + const BorderRadius.all(Radius.circular(4)), ), child: Row( mainAxisSize: MainAxisSize.min, @@ -169,8 +170,9 @@ class _VideoInfoState extends State { ), Text( videoDetailCtr.videoLabel.value, - textScaler: TextScaler.linear(1), - strutStyle: StrutStyle(leading: 0, height: 1), + textScaler: TextScaler.noScaling, + strutStyle: + const StrutStyle(leading: 0, height: 1), style: TextStyle( height: 1, fontSize: 13, @@ -181,7 +183,7 @@ class _VideoInfoState extends State { ), ), ), - TextSpan(text: ' '), + const TextSpan(text: ' '), ], TextSpan( text: @@ -200,7 +202,7 @@ class _VideoInfoState extends State { style: const TextStyle(fontSize: 16), ); - void handleState(Future Function() action) async { + Future handleState(Future Function() action) async { if (isProcessing.not) { isProcessing = true; await action(); @@ -233,7 +235,7 @@ class _VideoInfoState extends State { } // 视频介绍 - showIntroDetail() { + void showIntroDetail() { if (widget.loadingStatus) { return; } @@ -242,7 +244,7 @@ class _VideoInfoState extends State { } // 用户主页 - onPushMember() { + void onPushMember() { feedBack(); int? mid = !widget.loadingStatus ? videoDetail.owner?.mid @@ -403,7 +405,7 @@ class _VideoInfoState extends State { Positioned( right: -2, bottom: -2, - child: Container( + child: DecoratedBox( decoration: BoxDecoration( shape: BoxShape.circle, color: @@ -652,7 +654,7 @@ class _VideoInfoState extends State { color: theme.colorScheme.outline, ), ), - WidgetSpan(child: SizedBox(width: 2)), + const WidgetSpan(child: SizedBox(width: 2)), TextSpan( text: '${videoIntroController.videoDetail.value.argueMsg}', @@ -772,7 +774,8 @@ class _VideoInfoState extends State { videoDetail.ugcSeason != null && (context.orientation != Orientation.landscape || (context.orientation == Orientation.landscape && - videoDetailCtr.horizontalSeasonPanel.not))) + videoDetailCtr.plPlayerController + .horizontalSeasonPanel.not))) Obx( () => SeasonPanel( key: ValueKey(videoIntroController.videoDetail.value), @@ -787,7 +790,8 @@ class _VideoInfoState extends State { videoDetail.pages!.length > 1 && (context.orientation != Orientation.landscape || (context.orientation == Orientation.landscape && - videoDetailCtr.horizontalSeasonPanel.not))) ...[ + videoDetailCtr.plPlayerController + .horizontalSeasonPanel.not))) ...[ Obx( () => PagesPanel( key: ValueKey(videoIntroController.videoDetail.value), diff --git a/lib/pages/video/introduction/ugc/widgets/action_item.dart b/lib/pages/video/introduction/ugc/widgets/action_item.dart index 4b81ef59..b1e93d16 100644 --- a/lib/pages/video/introduction/ugc/widgets/action_item.dart +++ b/lib/pages/video/introduction/ugc/widgets/action_item.dart @@ -138,7 +138,7 @@ class ActionItemState extends State (widget.selectStatus ? "已" : "") + widget.semanticsLabel, child: InkWell( - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), onTap: _isThumbsUp ? null : () { diff --git a/lib/pages/video/introduction/ugc/widgets/page.dart b/lib/pages/video/introduction/ugc/widgets/page.dart index de396fb0..b05af009 100644 --- a/lib/pages/video/introduction/ugc/widgets/page.dart +++ b/lib/pages/video/introduction/ugc/widgets/page.dart @@ -146,7 +146,7 @@ class _PagesPanelState extends State { ), child: Material( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), clipBehavior: Clip.hardEdge, child: InkWell( onTap: () { diff --git a/lib/pages/video/introduction/ugc/widgets/season.dart b/lib/pages/video/introduction/ugc/widgets/season.dart index 165ddd7b..b5041051 100644 --- a/lib/pages/video/introduction/ugc/widgets/season.dart +++ b/lib/pages/video/introduction/ugc/widgets/season.dart @@ -98,7 +98,7 @@ class _SeasonPanelState extends State { ), child: Material( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), clipBehavior: Clip.hardEdge, child: InkWell( onTap: widget.onTap == false diff --git a/lib/pages/video/member/controller.dart b/lib/pages/video/member/controller.dart index 47abbc83..4f4345d1 100644 --- a/lib/pages/video/member/controller.dart +++ b/lib/pages/video/member/controller.dart @@ -104,7 +104,7 @@ class HorizontalMemberPageController extends CommonDataController { await queryData(); } - queryBySort() { + void queryBySort() { order.value = order.value == 'pubdate' ? 'click' : 'pubdate'; onReload(); } diff --git a/lib/pages/video/member/view.dart b/lib/pages/video/member/view.dart index de75b1f9..92839117 100644 --- a/lib/pages/video/member/view.dart +++ b/lib/pages/video/member/view.dart @@ -63,8 +63,9 @@ class _HorizontalMemberPageState extends State { void listener() { if (_controller.scrollController.position.pixels == 0) { if (_controller.hasPrev) { - _controller.isLoadPrevious = true; - _controller.onLoadMore(); + _controller + ..isLoadPrevious = true + ..onLoadMore(); } } } @@ -183,7 +184,7 @@ class _HorizontalMemberPageState extends State { controller: _controller.scrollController, physics: PositionRetainedScrollPhysics( shouldRetain: _controller.hasPrev, - parent: ClampingScrollPhysics(), + parent: const ClampingScrollPhysics(), ), slivers: [ _buildSliverHeader(theme), @@ -248,7 +249,7 @@ class _HorizontalMemberPageState extends State { ); } - _buildInfo(ThemeData theme, MemberInfoModel memberInfoModel) => Column( + Column _buildInfo(ThemeData theme, MemberInfoModel memberInfoModel) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -329,10 +330,8 @@ class _HorizontalMemberPageState extends State { foregroundColor: memberInfoModel.isFollowed == true ? theme.colorScheme.outline : null, - padding: const EdgeInsets.all(0), - visualDensity: const VisualDensity( - vertical: -2, - ), + padding: EdgeInsets.zero, + visualDensity: const VisualDensity(vertical: -2), ), onPressed: () { if (widget.mid == _ownerMid) { @@ -363,7 +362,7 @@ class _HorizontalMemberPageState extends State { ? '已关注' : '关注', maxLines: 1, - style: TextStyle(fontSize: 14), + style: const TextStyle(fontSize: 14), ), ), ), @@ -371,15 +370,13 @@ class _HorizontalMemberPageState extends State { Expanded( child: OutlinedButton( style: OutlinedButton.styleFrom( - padding: const EdgeInsets.all(0), - visualDensity: const VisualDensity( - vertical: -2, - ), + padding: EdgeInsets.zero, + visualDensity: const VisualDensity(vertical: -2), ), onPressed: () { Get.toNamed('/member?mid=${widget.mid}'); }, - child: Text( + child: const Text( '查看主页', maxLines: 1, style: TextStyle(fontSize: 14), @@ -409,7 +406,7 @@ class _HorizontalMemberPageState extends State { ); } - _buildAvatar(face) => Hero( + Hero _buildAvatar(face) => Hero( tag: face, child: GestureDetector( onTap: () { diff --git a/lib/pages/video/note/view.dart b/lib/pages/video/note/view.dart index c3b1702b..eb307dc6 100644 --- a/lib/pages/video/note/view.dart +++ b/lib/pages/video/note/view.dart @@ -66,7 +66,7 @@ class _NoteListPageState extends CommonSlidePageState { '笔记${_controller.count.value == -1 ? '' : '(${_controller.count.value})'}'), ), bottom: PreferredSize( - preferredSize: Size.fromHeight(1), + preferredSize: const Size.fromHeight(1), child: Divider( height: 1, color: theme.colorScheme.outline.withOpacity(0.1), @@ -108,8 +108,8 @@ class _NoteListPageState extends CommonSlidePageState { style: FilledButton.styleFrom( tapTargetSize: MaterialTapTargetSize.shrinkWrap, padding: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6)), ), ), onPressed: () { diff --git a/lib/pages/video/pay_coins/view.dart b/lib/pages/video/pay_coins/view.dart index 7f0037c3..79655731 100644 --- a/lib/pages/video/pay_coins/view.dart +++ b/lib/pages/video/pay_coins/view.dart @@ -23,7 +23,7 @@ class PayCoinsPage extends StatefulWidget { @override State createState() => _PayCoinsPageState(); - static toPayCoinsPage({ + static Future toPayCoinsPage({ required Function(int coin, bool coinWithLike) onPayCoin, int copyright = 1, bool hasCoin = false, @@ -113,7 +113,7 @@ class _PayCoinsPageState extends State late AnimationController _coinFadeController; late AnimationController _boxAnimController; - final List _images = [ + final List _images = const [ 'assets/images/paycoins/ic_thunder_1.png', 'assets/images/paycoins/ic_thunder_2.png', 'assets/images/paycoins/ic_thunder_3.png', @@ -240,7 +240,7 @@ class _PayCoinsPageState extends State child: SizedBox( height: 100, child: PageView.builder( - key: PageStorageKey('PageView'), + key: const PageStorageKey('PageView'), physics: const ClampingScrollPhysics(), itemCount: widget.copyright == 1 ? 2 : 1, controller: _controller, @@ -276,8 +276,7 @@ class _PayCoinsPageState extends State position: _boxAnimController.drive( Tween( - begin: - const Offset(0.0, 0.0), + begin: Offset.zero, end: const Offset(0.0, -0.2), ), @@ -290,8 +289,7 @@ class _PayCoinsPageState extends State position: _coinSlideController.drive( Tween( - begin: - const Offset(0.0, 0.0), + begin: Offset.zero, end: const Offset(0.0, -2), ), ), @@ -365,7 +363,7 @@ class _PayCoinsPageState extends State child: SlideTransition( position: _slide22Controller.drive( Tween( - begin: const Offset(0.0, 0.0), + begin: Offset.zero, end: const Offset(0.0, -0.2), ), ), @@ -385,7 +383,8 @@ class _PayCoinsPageState extends State Center( child: Text( '${_coins != null ? '硬币余额:${_coins!.toDouble().toPrecision(1)}' : ''}${widget.hasCoin ? '${_coins != null ? ',' : ''}已投1枚硬币' : ''}', - style: TextStyle(color: Colors.white, fontSize: 13), + style: + const TextStyle(color: Colors.white, fontSize: 13), ), ), ], diff --git a/lib/pages/video/post_panel/view.dart b/lib/pages/video/post_panel/view.dart index c6999cd7..4d251d9b 100644 --- a/lib/pages/video/post_panel/view.dart +++ b/lib/pages/video/post_panel/view.dart @@ -41,7 +41,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { VideoDetailController get videoDetailController => widget.videoDetailController; PlPlayerController get plPlayerController => widget.plPlayerController; - List? get list => videoDetailController.list; + List? get list => videoDetailController.postList; late final double videoDuration = plPlayerController.durationSeconds.value.inMilliseconds / 1000; @@ -117,7 +117,8 @@ class _PostPanelState extends CommonCollapseSlidePageState { padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(12), + borderRadius: + const BorderRadius.all(Radius.circular(12)), ), child: Column( mainAxisSize: MainAxisSize.min, @@ -164,7 +165,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { onSelected: (item) async { list![index].category = item; List constraintList = - segmentType2ActionType(item); + item.toActionType; if (constraintList .contains( list![index].actionType) @@ -212,7 +213,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { color: theme .colorScheme.secondary, ), - strutStyle: StrutStyle( + strutStyle: const StrutStyle( height: 1, leading: 0, ), @@ -252,11 +253,10 @@ class _PostPanelState extends CommonCollapseSlidePageState { .map( (item) => PopupMenuItem( - enabled: - segmentType2ActionType( - list![index] - .category) - .contains(item), + enabled: list![index] + .category + .toActionType + .contains(item), value: item, child: Text(item.title), ), @@ -273,7 +273,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { color: theme .colorScheme.secondary, ), - strutStyle: StrutStyle( + strutStyle: const StrutStyle( height: 1, leading: 0, ), @@ -401,7 +401,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { ), ); }, - child: Icon(Icons.check), + child: const Icon(Icons.check), ), ) ], @@ -502,7 +502,7 @@ class _PostPanelState extends CommonCollapseSlidePageState { ), TextButton( onPressed: () => Get.back(result: initV), - child: Text('确定'), + child: const Text('确定'), ), ], ); diff --git a/lib/pages/video/reply/view.dart b/lib/pages/video/reply/view.dart index 8c901c88..b52bdfc7 100644 --- a/lib/pages/video/reply/view.dart +++ b/lib/pages/video/reply/view.dart @@ -12,7 +12,7 @@ import 'package:get/get.dart'; import 'package:PiliPlus/common/skeleton/video_reply.dart'; import 'package:PiliPlus/models/common/reply_type.dart'; import 'package:PiliPlus/utils/feed_back.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/video/reply/controller.dart'; class VideoReplyPanel extends StatefulWidget { final String? bvid; @@ -171,7 +171,7 @@ class _VideoReplyPanelState extends State child: SlideTransition( position: Tween( begin: const Offset(0, 2), - end: const Offset(0, 0), + end: Offset.zero, ).animate(CurvedAnimation( parent: _videoReplyController.fabAnimationCtr, curve: Curves.easeInOut, diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index fdd12eda..6592cf35 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -62,6 +62,8 @@ class ReplyItemGrpc extends StatelessWidget { static final _voteRegExp = RegExp(r"\{vote:\d+?\}"); static final _timeRegExp = RegExp(r'^\b(?:\d+[::])?\d+[::]\d+\b$'); + static bool enableWordRe = + GStorage.setting.get(SettingBoxKey.enableWordRe, defaultValue: false); @override Widget build(BuildContext context) { @@ -327,10 +329,10 @@ class ReplyItemGrpc extends StatelessWidget { ); } - get _style => TextButton.styleFrom( - padding: const EdgeInsets.all(0), + ButtonStyle get _style => TextButton.styleFrom( + padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ); // 感谢、回复、复制 @@ -424,7 +426,7 @@ class ReplyItemGrpc extends StatelessWidget { margin: const EdgeInsets.only(left: 42, right: 4, top: 0), child: Material( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), clipBehavior: Clip.hardEdge, animationDuration: Duration.zero, child: Column( @@ -638,9 +640,6 @@ class ReplyItemGrpc extends StatelessWidget { )); } - late final bool enableWordRe = - GStorage.setting.get(SettingBoxKey.enableWordRe, defaultValue: false); - // 分割文本并处理每个部分 message.splitMapJoin( pattern, @@ -916,28 +915,29 @@ class ReplyItemGrpc extends StatelessWidget { // 图片渲染 if (content.pictures.isNotEmpty) { - spanChildren.add(const TextSpan(text: '\n')); - spanChildren.add( - WidgetSpan( - child: LayoutBuilder( - builder: (context, constraints) => imageView( - constraints.maxWidth, - content.pictures - .map( - (item) => ImageModel( - width: item.imgWidth, - height: item.imgHeight, - url: item.imgSrc, - ), - ) - .toList(), - onViewImage: onViewImage, - onDismissed: onDismissed, - callback: callback, + spanChildren + ..add(const TextSpan(text: '\n')) + ..add( + WidgetSpan( + child: LayoutBuilder( + builder: (context, constraints) => imageView( + constraints.maxWidth, + content.pictures + .map( + (item) => ImageModel( + width: item.imgWidth, + height: item.imgHeight, + url: item.imgSrc, + ), + ) + .toList(), + onViewImage: onViewImage, + onDismissed: onDismissed, + callback: callback, + ), ), ), - ), - ); + ); } // 笔记链接 @@ -1027,7 +1027,7 @@ class ReplyItemGrpc extends StatelessWidget { content: Text.rich( TextSpan( children: [ - TextSpan(text: '确定删除这条评论吗?\n\n'), + const TextSpan(text: '确定删除这条评论吗?\n\n'), if (ownerMid != item.member.mid.toInt()) ...[ TextSpan( text: '@${item.member.name}', @@ -1035,7 +1035,7 @@ class ReplyItemGrpc extends StatelessWidget { color: theme.colorScheme.primary, ), ), - TextSpan(text: ':\n'), + const TextSpan(text: ':\n'), ], TextSpan(text: message), ], @@ -1144,7 +1144,7 @@ class ReplyItemGrpc extends StatelessWidget { ListTile( onTap: () => menuActionHandler('top'), minLeadingWidth: 0, - leading: Icon(Icons.vertical_align_top, size: 19), + leading: const Icon(Icons.vertical_align_top, size: 19), title: Text( '${replyItem.replyControl.isUpTop ? '取消' : ''}置顶', style: style, @@ -1172,12 +1172,12 @@ class ReplyItemGrpc extends StatelessWidget { ListTile( onTap: () => menuActionHandler('checkReply'), minLeadingWidth: 0, - leading: Stack( + leading: const Stack( clipBehavior: Clip.none, alignment: Alignment.center, children: [ - const Icon(Icons.shield_outlined, size: 19), - const Icon(Icons.reply, size: 12), + Icon(Icons.shield_outlined, size: 19), + Icon(Icons.reply, size: 12), ], ), title: Text('检查评论', style: style), diff --git a/lib/pages/video/reply/widgets/zan_grpc.dart b/lib/pages/video/reply/widgets/zan_grpc.dart index 2bf92c15..9d92b45a 100644 --- a/lib/pages/video/reply/widgets/zan_grpc.dart +++ b/lib/pages/video/reply/widgets/zan_grpc.dart @@ -86,7 +86,7 @@ class _ZanButtonGrpcState extends State { } bool isProcessing = false; - void handleState(Future Function() action) async { + Future handleState(Future Function() action) async { if (isProcessing.not) { isProcessing = true; await action(); @@ -94,10 +94,10 @@ class _ZanButtonGrpcState extends State { } } - get _style => TextButton.styleFrom( - padding: const EdgeInsets.all(0), + ButtonStyle get _style => TextButton.styleFrom( + padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, ); @override diff --git a/lib/pages/video/reply_new/view.dart b/lib/pages/video/reply_new/view.dart index f7da9d97..535a214a 100644 --- a/lib/pages/video/reply_new/view.dart +++ b/lib/pages/video/reply_new/view.dart @@ -39,31 +39,28 @@ class ReplyPage extends CommonPublishPage { class _ReplyPageState extends CommonPublishPageState { final RxBool _syncToDynamic = false.obs; - Widget get child => GestureDetector( - onTap: Get.back, - child: LayoutBuilder( - builder: (context, constraints) { - bool isH = constraints.maxWidth > constraints.maxHeight; - late double padding = constraints.maxWidth * 0.12; - return Padding( - padding: EdgeInsets.symmetric(horizontal: isH ? padding : 0), - child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: Colors.transparent, - body: GestureDetector( - onTap: () {}, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - buildInputView(), - buildImagePreview(), - buildPanelContainer(themeData.colorScheme.surface), - ], - ), - ), + Widget get child => SafeArea( + bottom: false, + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + constraints: const BoxConstraints(maxWidth: 640), + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), ), - ); - }, + color: themeData.colorScheme.surface, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ...buildInputView(), + buildImagePreview(), + buildPanelContainer(Colors.transparent), + ], + ), + ), ), ); @@ -85,10 +82,7 @@ class _ReplyPageState extends CommonPublishPageState { } @override - Widget? customPanel(double height) => SizedBox( - height: height, - child: EmotePanel(onChoose: onChooseEmote), - ); + Widget? get customPanel => EmotePanel(onChoose: onChooseEmote); Widget buildImagePreview() { return Obx( @@ -96,7 +90,6 @@ class _ReplyPageState extends CommonPublishPageState { if (pathList.isNotEmpty) { return Container( height: 85, - color: themeData.colorScheme.surface, padding: const EdgeInsets.only(bottom: 10), child: ListView.separated( scrollDirection: Axis.horizontal, @@ -116,152 +109,133 @@ class _ReplyPageState extends CommonPublishPageState { ); } - Widget buildInputView() { - return Container( - clipBehavior: Clip.hardEdge, - margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top), - decoration: BoxDecoration( - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(12), - topRight: Radius.circular(12), - ), - color: themeData.colorScheme.surface, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: - const EdgeInsets.only(top: 12, right: 15, left: 15, bottom: 10), - child: Form( - autovalidateMode: AutovalidateMode.onUserInteraction, - child: Listener( - onPointerUp: (event) { - if (readOnly.value) { - updatePanelType(PanelType.keyboard); - selectKeyboard.value = true; + List buildInputView() { + return [ + Padding( + padding: + const EdgeInsets.only(top: 12, right: 15, left: 15, bottom: 10), + child: Form( + autovalidateMode: AutovalidateMode.onUserInteraction, + child: Listener( + onPointerUp: (event) { + if (readOnly.value) { + updatePanelType(PanelType.keyboard); + selectKeyboard.value = true; + } + }, + child: Obx( + () => TextField( + controller: editController, + minLines: 4, + maxLines: 8, + autofocus: false, + readOnly: readOnly.value, + onChanged: (value) { + bool isEmpty = value.trim().isEmpty; + if (!isEmpty && !enablePublish.value) { + enablePublish.value = true; + } else if (isEmpty && enablePublish.value) { + enablePublish.value = false; } + widget.onSave?.call(value); }, - child: Obx( - () => TextField( - controller: editController, - minLines: 4, - maxLines: 8, - autofocus: false, - readOnly: readOnly.value, - onChanged: (value) { - bool isEmpty = value.trim().isEmpty; - if (!isEmpty && !enablePublish.value) { - enablePublish.value = true; - } else if (isEmpty && enablePublish.value) { - enablePublish.value = false; - } - widget.onSave?.call(value); - }, - focusNode: focusNode, - decoration: InputDecoration( - hintText: widget.hint ?? "输入回复内容", - border: InputBorder.none, - hintStyle: TextStyle(fontSize: 14)), - style: themeData.textTheme.bodyLarge, - ), + focusNode: focusNode, + decoration: InputDecoration( + hintText: widget.hint ?? "输入回复内容", + border: InputBorder.none, + hintStyle: const TextStyle(fontSize: 14), ), + style: themeData.textTheme.bodyLarge, ), ), ), - Divider( - height: 1, - color: themeData.dividerColor.withOpacity(0.1), - ), - Container( - height: 52, - padding: const EdgeInsets.only(left: 12, right: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Obx( - () => ToolbarIconButton( - tooltip: '输入', - onPressed: () { - if (!selectKeyboard.value) { - selectKeyboard.value = true; - updatePanelType(PanelType.keyboard); - } - }, - icon: const Icon(Icons.keyboard, size: 22), - selected: selectKeyboard.value, - ), - ), - const SizedBox(width: 10), - Obx( - () => ToolbarIconButton( - tooltip: '表情', - onPressed: () { - if (selectKeyboard.value) { - selectKeyboard.value = false; - updatePanelType(PanelType.emoji); - } - }, - icon: const Icon(Icons.emoji_emotions, size: 22), - selected: !selectKeyboard.value, - ), - ), - if (widget.root == 0) ...[ - const SizedBox(width: 10), - ToolbarIconButton( - tooltip: '图片', - selected: false, - icon: const Icon(Icons.image, size: 22), - onPressed: onPickImage, - ), - ], - const Spacer(), - Obx( - () => TextButton.icon( - style: TextButton.styleFrom( - padding: const EdgeInsets.symmetric( - horizontal: 15, vertical: 13), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), - foregroundColor: _syncToDynamic.value - ? themeData.colorScheme.secondary - : themeData.colorScheme.outline, - ), - onPressed: () { - _syncToDynamic.value = !_syncToDynamic.value; - }, - icon: Icon( - _syncToDynamic.value - ? Icons.check_box - : Icons.check_box_outline_blank, - size: 22, - ), - label: const Text('转发至动态'), - ), - ), - const Spacer(), - Obx( - () => FilledButton.tonal( - onPressed: enablePublish.value ? onPublish : null, - style: FilledButton.styleFrom( - padding: const EdgeInsets.symmetric( - horizontal: 20, vertical: 10), - visualDensity: const VisualDensity( - horizontal: -2, - vertical: -2, - ), - ), - child: const Text('发送'), - ), - ), - ], - ), - ), - ], + ), ), - ); + Divider( + height: 1, + color: themeData.dividerColor.withOpacity(0.1), + ), + Container( + height: 52, + padding: const EdgeInsets.only(left: 12, right: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Obx( + () => ToolbarIconButton( + tooltip: '输入', + onPressed: () { + if (!selectKeyboard.value) { + selectKeyboard.value = true; + updatePanelType(PanelType.keyboard); + } + }, + icon: const Icon(Icons.keyboard, size: 22), + selected: selectKeyboard.value, + ), + ), + const SizedBox(width: 10), + Obx( + () => ToolbarIconButton( + tooltip: '表情', + onPressed: () { + if (selectKeyboard.value) { + selectKeyboard.value = false; + updatePanelType(PanelType.emoji); + } + }, + icon: const Icon(Icons.emoji_emotions, size: 22), + selected: !selectKeyboard.value, + ), + ), + if (widget.root == 0) ...[ + const SizedBox(width: 10), + ToolbarIconButton( + tooltip: '图片', + selected: false, + icon: const Icon(Icons.image, size: 22), + onPressed: onPickImage, + ), + ], + const Spacer(), + Obx( + () => TextButton.icon( + style: TextButton.styleFrom( + padding: + const EdgeInsets.symmetric(horizontal: 15, vertical: 13), + visualDensity: VisualDensity.compact, + foregroundColor: _syncToDynamic.value + ? themeData.colorScheme.secondary + : themeData.colorScheme.outline, + ), + onPressed: () { + _syncToDynamic.value = !_syncToDynamic.value; + }, + icon: Icon( + _syncToDynamic.value + ? Icons.check_box + : Icons.check_box_outline_blank, + size: 22, + ), + label: const Text('转发至动态'), + ), + ), + const Spacer(), + Obx( + () => FilledButton.tonal( + onPressed: enablePublish.value ? onPublish : null, + style: FilledButton.styleFrom( + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + visualDensity: VisualDensity.compact, + ), + child: const Text('发送'), + ), + ), + ], + ), + ) + ]; } @override diff --git a/lib/pages/video/reply_reply/controller.dart b/lib/pages/video/reply_reply/controller.dart index 5741c684..76b5cefd 100644 --- a/lib/pages/video/reply_reply/controller.dart +++ b/lib/pages/video/reply_reply/controller.dart @@ -131,7 +131,7 @@ class VideoReplyReplyController extends ReplyController ); @override - queryBySort() { + void queryBySort() { mode.value = mode.value == Mode.MAIN_LIST_HOT ? Mode.MAIN_LIST_TIME : Mode.MAIN_LIST_HOT; diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index a6a1a8d1..ead5478d 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -16,7 +16,7 @@ import 'package:PiliPlus/models/common/reply_type.dart'; import 'package:get/get_navigation/src/dialog/dialog_route.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/video/reply_reply/controller.dart'; class VideoReplyReplyPanel extends CommonSlidePage { const VideoReplyReplyPanel({ @@ -289,35 +289,36 @@ class _VideoReplyReplyPanelState ), ); - get _getImageCallback => _horizontalPreview - ? (imgList, index) { - final ctr = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 200), - )..forward(); - PageUtils.onHorizontalPreview( - _key, - AnimationController( - vsync: this, - duration: Duration.zero, - ), - ctr, - imgList, - index, - (value) async { - if (value == false) { - await ctr.reverse(); - } - try { - ctr.dispose(); - } catch (_) {} - if (value == false) { - Get.back(); - } - }, - ); - } - : null; + Function(dynamic imgList, dynamic index)? get _getImageCallback => + _horizontalPreview + ? (imgList, index) { + final ctr = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 200), + )..forward(); + PageUtils.onHorizontalPreview( + _key, + AnimationController( + vsync: this, + duration: Duration.zero, + ), + ctr, + imgList, + index, + (value) async { + if (value == false) { + await ctr.reverse(); + } + try { + ctr.dispose(); + } catch (_) {} + if (value == false) { + Get.back(); + } + }, + ); + } + : null; void _onReply(dynamic item, int index) { dynamic oid = item?.oid.toInt(); diff --git a/lib/pages/video/send_danmaku/view.dart b/lib/pages/video/send_danmaku/view.dart index ae04748f..870de766 100644 --- a/lib/pages/video/send_danmaku/view.dart +++ b/lib/pages/video/send_danmaku/view.dart @@ -50,19 +50,19 @@ class _SendDanmakuPanelState extends CommonPublishPageState { final List _colorList = [ Colors.white, - Color(0xFFFE0302), - Color(0xFFFF7204), - Color(0xFFFFAA02), - Color(0xFFFFD302), - Color(0xFFFFFF00), - Color(0xFFA0EE00), - Color(0xFF00CD00), - Color(0xFF019899), - Color(0xFF4266BE), - Color(0xFF89D5FF), - Color(0xFFCC0273), - Color(0xFF222222), - Color(0xFF9B9B9B), + const Color(0xFFFE0302), + const Color(0xFFFF7204), + const Color(0xFFFFAA02), + const Color(0xFFFFD302), + const Color(0xFFFFFF00), + const Color(0xFFA0EE00), + const Color(0xFF00CD00), + const Color(0xFF019899), + const Color(0xFF4266BE), + const Color(0xFF89D5FF), + const Color(0xFFCC0273), + const Color(0xFF222222), + const Color(0xFF9B9B9B), ]; @override @@ -86,7 +86,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { super.dispose(); } - get _buildColorPanel => Expanded( + Expanded get _buildColorPanel => Expanded( child: Obx( () => LayoutBuilder( key: ValueKey(_color.value), @@ -98,6 +98,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { return GridView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: crossAxisCount, crossAxisSpacing: 4, @@ -113,7 +114,8 @@ class _SendDanmakuPanelState extends CommonPublishPageState { child: Container( decoration: BoxDecoration( color: themeData.colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(8), + borderRadius: + const BorderRadius.all(Radius.circular(8)), ), alignment: Alignment.center, margin: const EdgeInsets.all(2), @@ -135,33 +137,26 @@ class _SendDanmakuPanelState extends CommonPublishPageState { ), ); - Widget get child => MediaQuery.removePadding( - removeTop: true, - context: context, - child: GestureDetector( - onTap: Get.back, - child: LayoutBuilder( - builder: (context, constraints) { - bool isH = constraints.maxWidth > constraints.maxHeight; - late double padding = constraints.maxWidth * 0.12; - return Padding( - padding: EdgeInsets.symmetric(horizontal: isH ? padding : 0), - child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: Colors.transparent, - body: GestureDetector( - onTap: () {}, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - _buildInputView(), - buildPanelContainer(themeData.colorScheme.surface), - ], - ), - ), - ), - ); - }, + Widget get child => SafeArea( + bottom: false, + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + constraints: const BoxConstraints(maxWidth: 450), + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12), + topRight: Radius.circular(12), + ), + color: themeData.colorScheme.surface, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildInputView(), + buildPanelContainer(Colors.transparent), + ], + ), ), ), ); @@ -182,8 +177,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { } @override - Widget? customPanel(double height) => Container( - height: height, + Widget? get customPanel => Container( padding: const EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( border: Border( @@ -227,7 +221,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { _buildColorPanel, ], ), - const SizedBox(height: 12), + SizedBox(height: 12 + MediaQuery.paddingOf(context).bottom), ], ), ), @@ -239,8 +233,9 @@ class _SendDanmakuPanelState extends CommonPublishPageState { _color.value = color; }, child: Container( + padding: const EdgeInsets.all(2), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), + borderRadius: const BorderRadius.all(Radius.circular(8)), border: _color.value != color ? null : Border.all( @@ -248,11 +243,10 @@ class _SendDanmakuPanelState extends CommonPublishPageState { color: themeData.colorScheme.primary, ), ), - child: Container( - margin: const EdgeInsets.all(2), + child: DecoratedBox( decoration: BoxDecoration( color: color, - borderRadius: BorderRadius.circular(6), + borderRadius: const BorderRadius.all(Radius.circular(6)), ), child: color == Colors.transparent ? Stack( @@ -260,8 +254,8 @@ class _SendDanmakuPanelState extends CommonPublishPageState { alignment: Alignment.center, children: [ Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(6)), gradient: LinearGradient( colors: [ Color(0xFFDD94DA), @@ -272,9 +266,9 @@ class _SendDanmakuPanelState extends CommonPublishPageState { ), Container( margin: const EdgeInsets.all(5), - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(4), + borderRadius: BorderRadius.all(Radius.circular(4)), ), ), ], @@ -298,7 +292,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { color: _mode.value == mode ? themeData.colorScheme.secondaryContainer : themeData.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(8), + borderRadius: const BorderRadius.all(Radius.circular(8)), ), padding: const EdgeInsets.symmetric(vertical: 5), child: Text( @@ -328,7 +322,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { color: _fontsize.value == fontsize ? themeData.colorScheme.secondaryContainer : themeData.colorScheme.onInverseSurface, - borderRadius: BorderRadius.circular(8), + borderRadius: const BorderRadius.all(Radius.circular(8)), ), padding: const EdgeInsets.symmetric(vertical: 5), child: Text( @@ -346,17 +340,8 @@ class _SendDanmakuPanelState extends CommonPublishPageState { } Widget _buildInputView() { - return Container( - clipBehavior: Clip.hardEdge, - margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top), + return Padding( padding: const EdgeInsets.only(left: 8, top: 2, right: 8), - decoration: BoxDecoration( - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(12), - topRight: Radius.circular(12), - ), - color: themeData.colorScheme.surface, - ), child: Row( children: [ Obx( @@ -470,7 +455,7 @@ class _SendDanmakuPanelState extends CommonPublishPageState { builder: (context) => AlertDialog( clipBehavior: Clip.hardEdge, contentPadding: const EdgeInsets.symmetric(vertical: 16), - title: Text('Color Picker'), + title: const Text('Color Picker'), content: SlideColorPicker( showResetBtn: false, color: _color.value, diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 645d41df..e4c91e8a 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -94,11 +94,11 @@ class _VideoDetailPageVState extends State (videoIntroController.videoDetail.value.ugcSeason != null || ((videoIntroController.videoDetail.value.pages?.length ?? 0) > 1)) && context.orientation == Orientation.landscape && - videoDetailController.horizontalSeasonPanel; + videoDetailController.plPlayerController.horizontalSeasonPanel; bool get _horizontalPreview => context.orientation == Orientation.landscape && - videoDetailController.horizontalPreview; + videoDetailController.plPlayerController.horizontalPreview; StreamSubscription? _listenerDetail; StreamSubscription? _listenerLoadingState; @@ -226,7 +226,7 @@ class _VideoDetailPageVState extends State } // 播放器状态监听 - void playerListener(PlayerStatus? status) async { + Future playerListener(PlayerStatus? status) async { try { if (videoDetailController.scrollCtr.hasClients) { bool isPlaying = status == PlayerStatus.playing; @@ -303,7 +303,7 @@ class _VideoDetailPageVState extends State } // 继续播放或重新播放 - void continuePlay() async { + Future continuePlay() async { plPlayerController!.play(); } @@ -322,7 +322,7 @@ class _VideoDetailPageVState extends State plPlayerController = videoDetailController.plPlayerController; videoDetailController.isShowCover.value = false; videoDetailController.autoPlay.value = true; - if (videoDetailController.preInitPlayer) { + if (videoDetailController.plPlayerController.preInitPlayer) { await plPlayerController!.play(); } else { await videoDetailController.playerInit(autoplay: true); @@ -383,7 +383,7 @@ class _VideoDetailPageVState extends State @override // 离开当前页面时 - void didPushNext() async { + Future didPushNext() async { if (videoDetailController.imageStatus) { return; } @@ -395,13 +395,13 @@ class _VideoDetailPageVState extends State videoDetailController.positionSubscription?.cancel(); videoIntroController.canelTimer(); - videoDetailController.playerStatus = - plPlayerController?.playerStatus.status.value; - - videoDetailController.brightness = plPlayerController?.brightness.value; + videoDetailController + ..playerStatus = plPlayerController?.playerStatus.status.value + ..brightness = plPlayerController?.brightness.value; if (plPlayerController != null) { - videoDetailController.makeHeartBeat(); - videoDetailController.showVP = plPlayerController!.showVP.value; + videoDetailController + ..makeHeartBeat() + ..showVP = plPlayerController!.showVP.value; plPlayerController!.removeStatusLister(playerListener); plPlayerController!.removePositionListener(positionListener); plPlayerController!.pause(); @@ -412,7 +412,7 @@ class _VideoDetailPageVState extends State @override // 返回当前页面时 - void didPopNext() async { + Future didPopNext() async { if (videoDetailController.imageStatus) { return; } @@ -449,7 +449,7 @@ class _VideoDetailPageVState extends State await videoDetailController.playerInit( autoplay: videoDetailController.playerStatus == PlayerStatus.playing, ); - } else if (videoDetailController.preInitPlayer && + } else if (videoDetailController.plPlayerController.preInitPlayer && videoDetailController.isQuerying.not && videoDetailController.videoState.value is! Error) { await videoDetailController.playerInit(); @@ -549,7 +549,7 @@ class _VideoDetailPageVState extends State appBar: removeSafeArea ? null : PreferredSize( - preferredSize: Size.fromHeight(0), + preferredSize: const Size.fromHeight(0), child: Obx( () { bool shouldShow = @@ -1155,7 +1155,8 @@ class _VideoDetailPageVState extends State introText: '相关视频', showIntro: videoDetailController.videoType == SearchType.video && - videoDetailController.showRelatedVideo, + videoDetailController + .plPlayerController.showRelatedVideo, showReply: videoDetailController.showReply, ), Expanded( @@ -1164,7 +1165,8 @@ class _VideoDetailPageVState extends State children: [ if (videoDetailController.videoType == SearchType.video && - videoDetailController.showRelatedVideo) + videoDetailController + .plPlayerController.showRelatedVideo) CustomScrollView( controller: _introController, slivers: [ @@ -1646,7 +1648,7 @@ class _VideoDetailPageVState extends State child: Stack( clipBehavior: Clip.none, children: [ - Positioned.fill(child: ColoredBox(color: Colors.black)), + const Positioned.fill(child: ColoredBox(color: Colors.black)), if (isShowing) plPlayer, @@ -1686,7 +1688,7 @@ class _VideoDetailPageVState extends State manualPlayerWidget, ], - if (videoDetailController.enableSponsorBlock || + if (videoDetailController.plPlayerController.enableSponsorBlock || videoDetailController.continuePlayingPart) Positioned( left: 16, @@ -1759,8 +1761,9 @@ class _VideoDetailPageVState extends State .map((item) { return FilledButton.tonal( style: FilledButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), + shape: const RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6)), ), backgroundColor: themeData .colorScheme.secondaryContainer @@ -1769,8 +1772,7 @@ class _VideoDetailPageVState extends State horizontal: 15, vertical: 10, ), - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), + visualDensity: VisualDensity.compact, tapTargetSize: MaterialTapTargetSize.shrinkWrap, ), onPressed: () { @@ -1824,7 +1826,9 @@ class _VideoDetailPageVState extends State showEpisodes: showEpisodes, onShowMemberPage: onShowMemberPage, ), - if (needRelated && videoDetailController.showRelatedVideo) ...[ + if (needRelated && + videoDetailController + .plPlayerController.showRelatedVideo) ...[ SliverToBoxAdapter( child: Padding( padding: @@ -2087,14 +2091,14 @@ class _VideoDetailPageVState extends State } // ai总结 - showAiBottomSheet() { + void showAiBottomSheet() { videoDetailController.childKey.currentState?.showBottomSheet( backgroundColor: Colors.transparent, (context) => AiDetail(modelResult: videoIntroController.modelResult), ); } - showIntroDetail(videoDetail, videoTags) { + void showIntroDetail(videoDetail, videoTags) { videoDetailController.childKey.currentState?.showBottomSheet( backgroundColor: Colors.transparent, (context) => bangumi.IntroDetail( @@ -2104,7 +2108,7 @@ class _VideoDetailPageVState extends State ); } - showEpisodes([index, season, episodes, bvid, aid, cid]) { + void showEpisodes([index, season, episodes, bvid, aid, cid]) { if (bvid == null) { videoDetailController.showMediaListPanel(context); return; @@ -2212,7 +2216,7 @@ class _VideoDetailPageVState extends State .reversed .toList(); - if (videoDetailController.reverseFromFirst.not) { + if (videoDetailController.plPlayerController.reverseFromFirst.not) { // keep current episode videoDetailController.seasonIndex.refresh(); videoDetailController.cid.refresh(); @@ -2234,7 +2238,7 @@ class _VideoDetailPageVState extends State !videoIntroController.videoDetail.value.isPageReversed; videoIntroController.videoDetail.value.pages = videoIntroController.videoDetail.value.pages!.reversed.toList(); - if (videoDetailController.reverseFromFirst.not) { + if (videoDetailController.plPlayerController.reverseFromFirst.not) { // keep current episode videoDetailController.cid.refresh(); } else { diff --git a/lib/pages/video/view_point/view.dart b/lib/pages/video/view_point/view.dart index f92aa452..a368b122 100644 --- a/lib/pages/video/view_point/view.dart +++ b/lib/pages/video/view_point/view.dart @@ -42,7 +42,7 @@ class _ViewPointsPageState title: const Text('分段信息'), toolbarHeight: 45, actions: [ - Text( + const Text( '分段进度条', style: TextStyle(fontSize: 16), ), @@ -75,7 +75,7 @@ class _ViewPointsPageState const SizedBox(width: 16), ], bottom: PreferredSize( - preferredSize: Size.fromHeight(1), + preferredSize: const Size.fromHeight(1), child: Divider( height: 1, color: theme.dividerColor.withOpacity(0.1), @@ -120,7 +120,8 @@ class _ViewPointsPageState margin: const EdgeInsets.symmetric(vertical: 6), decoration: currentIndex == index ? BoxDecoration( - borderRadius: BorderRadius.circular(6), + borderRadius: + const BorderRadius.all(Radius.circular(6)), border: Border.all( width: 1.8, strokeAlign: BorderSide.strokeAlignOutside, diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 5f35a38f..be32da75 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -212,7 +212,8 @@ class HeaderControlState extends State { .values[ widget.controller.superResolutionType] .title, - strutStyle: StrutStyle(leading: 0, height: 1), + strutStyle: + const StrutStyle(leading: 0, height: 1), style: TextStyle( height: 1, fontSize: 14, @@ -645,9 +646,10 @@ class HeaderControlState extends State { } Get.back(); final int quality = videoFormat[i].quality!; - videoDetailCtr.currentVideoQa = - VideoQualityCode.fromCode(quality)!; - videoDetailCtr.updatePlayer(); + videoDetailCtr + ..currentVideoQa = + VideoQualityCode.fromCode(quality)! + ..updatePlayer(); // update late String oldQualityDesc; @@ -739,9 +741,10 @@ class HeaderControlState extends State { } Get.back(); final int quality = i.id!; - videoDetailCtr.currentAudioQa = - AudioQualityCode.fromCode(quality)!; - videoDetailCtr.updatePlayer(); + videoDetailCtr + ..currentAudioQa = + AudioQualityCode.fromCode(quality)! + ..updatePlayer(); // update late String oldQualityDesc; @@ -840,9 +843,10 @@ class HeaderControlState extends State { if (i.startsWith(currentDecodeFormats.code)) { return; } - videoDetailCtr.currentDecodeFormats = - VideoDecodeFormatsCode.fromString(i)!; - videoDetailCtr.updatePlayer(); + videoDetailCtr + ..currentDecodeFormats = + VideoDecodeFormatsCode.fromString(i)! + ..updatePlayer(); Get.back(); }, contentPadding: @@ -929,8 +933,8 @@ class HeaderControlState extends State { SmartDialog.showToast(e.toString()); } }, - title: - Text(item['lan_doc'], style: TextStyle(fontSize: 14)), + title: Text(item['lan_doc'], + style: const TextStyle(fontSize: 14)), ), ) .toList(), @@ -1038,7 +1042,7 @@ class HeaderControlState extends State { child: ListView( padding: EdgeInsets.zero, children: [ - SizedBox( + const SizedBox( height: 45, child: Center(child: Text('字幕设置', style: titleStyle)), ), @@ -1260,7 +1264,7 @@ class HeaderControlState extends State { /// 弹幕功能 void showSetDanmaku() { // 屏蔽类型 - final List> blockTypesList = [ + const List> blockTypesList = [ {'value': 5, 'label': '顶部'}, {'value': 2, 'label': '滚动'}, {'value': 4, 'label': '底部'}, @@ -1443,7 +1447,7 @@ class HeaderControlState extends State { child: ListView( padding: EdgeInsets.zero, children: [ - SizedBox( + const SizedBox( height: 45, child: Center(child: Text('弹幕设置', style: titleStyle)), ), @@ -1533,8 +1537,8 @@ class HeaderControlState extends State { ), SetSwitchItem( title: '海量弹幕', - contentPadding: EdgeInsets.all(0), - titleStyle: TextStyle(fontSize: 14), + contentPadding: EdgeInsets.zero, + titleStyle: const TextStyle(fontSize: 14), defaultVal: massiveMode, setKey: SettingBoxKey.danmakuMassiveMode, onChanged: (value) { @@ -1851,7 +1855,7 @@ class HeaderControlState extends State { ); } - startClock() { + void startClock() { clock ??= Timer.periodic(const Duration(seconds: 1), (Timer t) { if (!mounted) { return; @@ -1950,7 +1954,8 @@ class HeaderControlState extends State { )..layout(maxWidth: constraints.maxWidth); if (textPainter.didExceedMaxLines) { return ConstrainedBox( - constraints: BoxConstraints(maxHeight: 25), + constraints: + const BoxConstraints(maxHeight: 25), child: Marquee( text: title, style: const TextStyle( @@ -2026,7 +2031,7 @@ class HeaderControlState extends State { return const SizedBox.shrink(); }, ), - if (videoDetailCtr.enableSponsorBlock == true) + if (plPlayerController.enableSponsorBlock == true) SizedBox( width: 42, height: 34, @@ -2036,7 +2041,7 @@ class HeaderControlState extends State { padding: WidgetStateProperty.all(EdgeInsets.zero), ), onPressed: () => videoDetailCtr.onBlock(context), - icon: Stack( + icon: const Stack( clipBehavior: Clip.none, alignment: Alignment.center, children: [ @@ -2252,8 +2257,9 @@ class HeaderControlState extends State { onTap: videoIntroController.actionLikeVideo, onLongPress: () { videoIntroController.actionOneThree(); - plPlayerController.isTriple = null; - plPlayerController.hideTaskControls(); + plPlayerController + ..isTriple = null + ..hideTaskControls(); }, selectStatus: videoIntroController.hasLike.value, @@ -2273,8 +2279,9 @@ class HeaderControlState extends State { _coinKey.currentState?.controller ?.reverse(); _favKey.currentState?.controller?.reverse(); - plPlayerController.isTriple = null; - plPlayerController.hideTaskControls(); + plPlayerController + ..isTriple = null + ..hideTaskControls(); } }, ), @@ -2372,8 +2379,9 @@ class HeaderControlState extends State { onTap: bangumiIntroController.actionLikeVideo, onLongPress: () { bangumiIntroController.actionOneThree(); - plPlayerController.isTriple = null; - plPlayerController.hideTaskControls(); + plPlayerController + ..isTriple = null + ..hideTaskControls(); }, selectStatus: bangumiIntroController.hasLike.value, @@ -2394,8 +2402,9 @@ class HeaderControlState extends State { _coinKey.currentState?.controller ?.reverse(); _favKey.currentState?.controller?.reverse(); - plPlayerController.isTriple = null; - plPlayerController.hideTaskControls(); + plPlayerController + ..isTriple = null + ..hideTaskControls(); } }, ), diff --git a/lib/pages/webdav/view.dart b/lib/pages/webdav/view.dart index 6eaebba5..22d77708 100644 --- a/lib/pages/webdav/view.dart +++ b/lib/pages/webdav/view.dart @@ -83,7 +83,7 @@ class _WebDavSettingPageState extends State { Expanded( child: FilledButton.tonal( style: FilledButton.styleFrom( - shape: RoundedRectangleBorder( + shape: const RoundedRectangleBorder( borderRadius: StyleString.mdRadius, ), ), @@ -95,7 +95,7 @@ class _WebDavSettingPageState extends State { Expanded( child: FilledButton.tonal( style: FilledButton.styleFrom( - shape: RoundedRectangleBorder( + shape: const RoundedRectangleBorder( borderRadius: StyleString.mdRadius, ), ), diff --git a/lib/pages/webview/view.dart b/lib/pages/webview/view.dart index db080817..8e792714 100644 --- a/lib/pages/webview/view.dart +++ b/lib/pages/webview/view.dart @@ -22,7 +22,7 @@ enum _WebviewMenuItem { } extension _WebviewMenuItemExt on _WebviewMenuItem { - String get title => [ + String get title => const [ '刷新', '复制链接', '浏览器中打开', @@ -177,25 +177,27 @@ class _WebviewPageState extends State { URLRequest(url: WebUri.uri(Uri.tryParse(_url) ?? Uri())), onWebViewCreated: (InAppWebViewController controller) { _webViewController = controller; - controller.addJavaScriptHandler( - handlerName: 'finishButtonClicked', - callback: (args) { - Get.back(); - }, - ); - controller.addJavaScriptHandler( - handlerName: 'infoBarClicked', - callback: (args) async { - WebUri? uri = await controller.getUrl(); - if (uri != null) { - String? oid = - RegExp(r'oid=(\d+)').firstMatch(uri.toString())?.group(1); - if (oid != null) { - PiliScheme.videoPush(int.parse(oid), null); + controller + ..addJavaScriptHandler( + handlerName: 'finishButtonClicked', + callback: (args) { + Get.back(); + }, + ) + ..addJavaScriptHandler( + handlerName: 'infoBarClicked', + callback: (args) async { + WebUri? uri = await controller.getUrl(); + if (uri != null) { + String? oid = RegExp(r'oid=(\d+)') + .firstMatch(uri.toString()) + ?.group(1); + if (oid != null) { + PiliScheme.videoPush(int.parse(oid), null); + } } - } - }, - ); + }, + ); }, onProgressChanged: (controller, progress) { this.progress.value = progress / 100; @@ -207,12 +209,13 @@ class _WebviewPageState extends State { onLoadStop: (controller, uri) { final url = uri.toString(); if (url.startsWith('https://www.bilibili.com/h5/note-app')) { - controller.evaluateJavascript(source: """ + controller + ..evaluateJavascript(source: """ document.querySelector('.finish-btn').addEventListener('click', function() { window.flutter_inappwebview.callHandler('finishButtonClicked'); }); -"""); - controller.evaluateJavascript(source: """ +""") + ..evaluateJavascript(source: """ document.querySelector('.info-bar').addEventListener('click', function() { window.flutter_inappwebview.callHandler('infoBarClicked'); }); diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index 28813bfa..6d82de8e 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -import 'controller.dart'; +import 'package:PiliPlus/pages/whisper/controller.dart'; class WhisperPage extends StatefulWidget { const WhisperPage({super.key}); diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index 99eef3ce..fa522d8c 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -17,7 +17,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/pages/whisper_detail/controller.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:image_picker/image_picker.dart'; -import 'widget/chat_item.dart'; +import 'package:PiliPlus/pages/whisper_detail/widget/chat_item.dart'; class WhisperDetailPage extends CommonPublishPage { const WhisperDetailPage({ @@ -197,7 +197,7 @@ class _WhisperDetailPageState padding: const EdgeInsets.symmetric(vertical: 8), decoration: BoxDecoration( color: theme.colorScheme.onInverseSurface, - borderRadius: BorderRadius.only( + borderRadius: const BorderRadius.only( topLeft: Radius.circular(16), topRight: Radius.circular(16), ), @@ -244,9 +244,9 @@ class _WhisperDetailPageState filled: true, hintText: '发个消息聊聊呗~', fillColor: theme.colorScheme.surface, - border: OutlineInputBorder( + border: const OutlineInputBorder( borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(6), + borderRadius: BorderRadius.all(Radius.circular(6)), gapPadding: 0, ), contentPadding: const EdgeInsets.all(10), @@ -319,10 +319,7 @@ class _WhisperDetailPageState } @override - Widget? customPanel(double height) => SizedBox( - height: height, - child: EmotePanel(onChoose: onChooseEmote), - ); + Widget? get customPanel => EmotePanel(onChoose: onChooseEmote); @override Future onCustomPublish({required String message, List? pictures}) { diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index 33cfd900..247efe6a 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -19,17 +19,17 @@ enum MsgType { audio(value: 3, label: "语音消息"), share(value: 4, label: "分享消息"), revoke(value: 5, label: "撤回消息"), - custom_face(value: 6, label: "自定义表情"), - share_v2(value: 7, label: "分享v2消息"), - sys_cancel(value: 8, label: "系统撤销"), - mini_program(value: 9, label: "小程序"), - notify_msg(value: 10, label: "业务通知"), - archive_card(value: 11, label: "投稿卡片"), - article_card(value: 12, label: "专栏卡片"), - pic_card(value: 13, label: "图片卡片"), - common_share(value: 14, label: "异形卡片"), - auto_reply_push(value: 16, label: "自动回复推送"), - notify_text(value: 18, label: "文本提示"); + customFace(value: 6, label: "自定义表情"), + shareV2(value: 7, label: "分享v2消息"), + sysCancel(value: 8, label: "系统撤销"), + miniProgram(value: 9, label: "小程序"), + notifyMsg(value: 10, label: "业务通知"), + archiveCard(value: 11, label: "投稿卡片"), + articleCard(value: 12, label: "专栏卡片"), + picCard(value: 13, label: "图片卡片"), + commonShare(value: 14, label: "异形卡片"), + autoReplyPush(value: 16, label: "自动回复推送"), + notifyText(value: 18, label: "文本提示"); final int value; final String label; @@ -62,10 +62,10 @@ class ChatItem extends StatelessWidget { // bool isArticle = item.msgType == 12; // 专栏 bool isRevoke = item.msgType == MsgType.revoke.value; // 撤回消息 // bool isShareV2 = item.msgType == MsgType.share_v2.value; - bool isSystem = item.msgType == MsgType.notify_text.value || - item.msgType == MsgType.notify_msg.value || - item.msgType == MsgType.pic_card.value || - item.msgType == MsgType.auto_reply_push.value; + bool isSystem = item.msgType == MsgType.notifyText.value || + item.msgType == MsgType.notifyMsg.value || + item.msgType == MsgType.picCard.value || + item.msgType == MsgType.autoReplyPush.value; dynamic content = item.content ?? ''; final ThemeData theme = Theme.of(context); Color textColor() { @@ -144,11 +144,11 @@ class ChatItem extends StatelessWidget { Widget messageContent(BuildContext context) { switch (MsgType.parse(item.msgType!)) { - case MsgType.notify_msg: + case MsgType.notifyMsg: return systemNotice(theme); - case MsgType.pic_card: + case MsgType.picCard: return systemNotice2(); - case MsgType.notify_text: + case MsgType.notifyText: return Text( jsonDecode(content['content']) .map((m) => m['text'] as String) @@ -180,7 +180,7 @@ class ChatItem extends StatelessWidget { ), ), ); - case MsgType.share_v2: + case MsgType.shareV2: String? type; GestureTapCallback onTap; switch (content['source']) { @@ -302,7 +302,7 @@ class ChatItem extends StatelessWidget { ], ], ); - case MsgType.archive_card: + case MsgType.archiveCard: return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -354,7 +354,7 @@ class ChatItem extends StatelessWidget { ), ], ); - case MsgType.auto_reply_push: + case MsgType.autoReplyPush: return Container( constraints: const BoxConstraints( maxWidth: 300.0, // 设置最大宽度为200.0 @@ -460,7 +460,7 @@ class ChatItem extends StatelessWidget { ], ], )); - case MsgType.article_card: + case MsgType.articleCard: return GestureDetector( onTap: () async { Get.toNamed( @@ -509,7 +509,7 @@ class ChatItem extends StatelessWidget { ], ), ); - case MsgType.common_share: + case MsgType.commonShare: if (content['source'] == '直播') { return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 3a5f339e..1321e69a 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -3,9 +3,12 @@ import 'dart:convert'; import 'dart:io'; import 'package:PiliPlus/common/constants.dart'; +import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/models/common/audio_normalization.dart'; +import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart'; +import 'package:PiliPlus/models/common/sponsor_block/skip_type.dart'; import 'package:PiliPlus/models/user/danmaku_rule.dart'; import 'package:PiliPlus/plugin/pl_player/models/data_source.dart'; import 'package:PiliPlus/plugin/pl_player/models/data_status.dart'; @@ -111,7 +114,6 @@ class PlPlayerController { dynamic _seasonId; dynamic _subType; int _heartDuration = 0; - bool _enableHeart = true; late DataSource dataSource; @@ -239,14 +241,6 @@ class PlPlayerController { /// 弹幕开关 RxBool isOpenDanmu = false.obs; - late final showFSActionItem = GStorage.showFSActionItem; - late final enableShrinkVideoSize = GStorage.enableShrinkVideoSize; - late final darkVideoPage = GStorage.darkVideoPage; - late final enableSlideVolumeBrightness = GStorage.enableSlideVolumeBrightness; - late final enableSlideFS = GStorage.enableSlideFS; - late final enableDragSubtitle = GStorage.enableDragSubtitle; - late final fastForBackwardDuration = GStorage.fastForBackwardDuration; - /// 弹幕权重 int danmakuWeight = 0; late RuleFilter filters; @@ -279,6 +273,47 @@ class PlPlayerController { late double subtitleStrokeWidth = GStorage.subtitleStrokeWidth; late int subtitleFontWeight = GStorage.subtitleFontWeight; + // sponsor block + late final bool enableSponsorBlock = + setting.get(SettingBoxKey.enableSponsorBlock, defaultValue: false); + late final double blockLimit = GStorage.blockLimit; + late final List> blockSettings = + GStorage.blockSettings; + late final List blockColor = GStorage.blockColor; + late final List segmentTypes = + SegmentType.values.map((item) => item.name).toList(); + late final List enableList = blockSettings + .where((item) => item.second != SkipType.disable) + .map((item) => item.first.name) + .toList(); + late final blockServer = GStorage.blockServer; + + // settings + late final showFSActionItem = GStorage.showFSActionItem; + late final enableShrinkVideoSize = GStorage.enableShrinkVideoSize; + late final darkVideoPage = GStorage.darkVideoPage; + late final enableSlideVolumeBrightness = GStorage.enableSlideVolumeBrightness; + late final enableSlideFS = GStorage.enableSlideFS; + late final enableDragSubtitle = GStorage.enableDragSubtitle; + late final fastForBackwardDuration = GStorage.fastForBackwardDuration; + + late final horizontalSeasonPanel = GStorage.horizontalSeasonPanel; + late final preInitPlayer = GStorage.preInitPlayer; + late final showRelatedVideo = GStorage.showRelatedVideo; + late final showVideoReply = GStorage.showVideoReply; + late final showBangumiReply = GStorage.showBangumiReply; + late final reverseFromFirst = GStorage.reverseFromFirst; + late final horizontalPreview = GStorage.horizontalPreview; + late final showDmChart = GStorage.showDmChart; + + int? cacheVideoQa; + late int cacheAudioQa; + bool enableHeart = true; + + bool enableHA = + GStorage.setting.get(SettingBoxKey.enableHA, defaultValue: true); + String hwdec = GStorage.hardwareDecoding; + // 播放顺序相关 PlayRepeat playRepeat = PlayRepeat.pause; @@ -440,6 +475,11 @@ class PlPlayerController { setting.get(SettingBoxKey.enableLongShowControl, defaultValue: false); speedList = GStorage.speedList; + if (!Accounts.get(AccountType.heartbeat).isLogin || + GStorage.localCache.get(LocalCacheKey.historyPause) == true) { + enableHeart = false; + } + // _playerEventSubs = onPlayerStatusChanged.listen((PlayerStatus status) { // if (status == PlayerStatus.playing) { // WakelockPlus.enable(); @@ -474,9 +514,6 @@ class PlPlayerController { Duration? seekTo, // 初始化播放速度 double speed = 1.0, - // 硬件加速 - bool enableHA = true, - String? hwdec, double? width, double? height, Duration? duration, @@ -485,8 +522,6 @@ class PlPlayerController { // 记录历史记录 String bvid = '', int cid = 0, - // 历史记录开关 - bool enableHeart = true, dynamic epid, dynamic seasonId, dynamic subType, @@ -511,7 +546,6 @@ class PlPlayerController { _epid = epid; _seasonId = seasonId; _subType = subType; - _enableHeart = enableHeart; if (showSeekPreview) { videoShot = null; @@ -529,7 +563,7 @@ class PlPlayerController { } // 配置Player 音轨、字幕等等 _videoPlayerController = await _createVideoController( - dataSource, _looping, enableHA, hwdec, width, height, seekTo); + dataSource, _looping, width, height, seekTo); callback?.call(); // 获取视频时长 00:00 _duration.value = duration ?? _videoPlayerController!.state.duration; @@ -564,7 +598,7 @@ class PlPlayerController { final directory = await getApplicationSupportDirectory(); shadersDirectory = Directory(path.join(directory.path, 'anime_shaders')); - if (!await shadersDirectory!.exists()) { + if (!shadersDirectory!.existsSync()) { await shadersDirectory!.create(recursive: true); } @@ -576,7 +610,7 @@ class PlPlayerController { for (var filePath in shaderFiles) { final fileName = filePath.split('/').last; final targetFile = File(path.join(shadersDirectory!.path, fileName)); - if (await targetFile.exists()) { + if (targetFile.existsSync()) { continue; } @@ -636,8 +670,6 @@ class PlPlayerController { Future _createVideoController( DataSource dataSource, PlaylistMode looping, - bool enableHA, - String? hwdec, double? width, double? height, Duration? seekTo, @@ -1123,7 +1155,7 @@ class PlPlayerController { } /// 调整播放时间 - onChangedSlider(double v) { + void onChangedSlider(double v) { _sliderPosition.value = Duration(seconds: v.floor()); updateSliderPositionSecond(); } @@ -1278,7 +1310,7 @@ class PlPlayerController { } /// 设置长按倍速状态 live模式下禁用 - void setLongPressStatus(bool val) async { + Future setLongPressStatus(bool val) async { if (videoType.value == 'live') { return; } @@ -1314,13 +1346,17 @@ class PlPlayerController { updateSubtitleStyle(); } + late final FullScreenMode mode = FullScreenModeCode.fromCode( + setting.get(SettingBoxKey.fullScreenMode, defaultValue: 0)); + late final horizontalScreen = + setting.get(SettingBoxKey.horizontalScreen, defaultValue: false); + // 全屏 void triggerFullScreen({bool status = true, int duration = 500}) { EasyThrottle.throttle('fullScreen', Duration(milliseconds: duration), () async { stopScreenTimer(); - FullScreenMode mode = FullScreenModeCode.fromCode( - setting.get(SettingBoxKey.fullScreenMode, defaultValue: 0))!; + if (!isFullScreen.value && status) { hideStatusBar(); @@ -1354,7 +1390,7 @@ class PlPlayerController { if (mode == FullScreenMode.none) { return; } - if (!setting.get(SettingBoxKey.horizontalScreen, defaultValue: false)) { + if (!horizontalScreen) { await verticalScreenForTwoSeconds(); } else { await autoScreen(); @@ -1398,7 +1434,7 @@ class PlPlayerController { dynamic seasonId, dynamic subType, }) async { - if (!_enableHeart || MineController.anonymity.value || progress == 0) { + if (!enableHeart || MineController.anonymity.value || progress == 0) { return; } else if (playerStatus.status.value == PlayerStatus.paused) { if (isManual.not) { @@ -1440,33 +1476,35 @@ class PlPlayerController { } } - setPlayRepeat(PlayRepeat type) { + void setPlayRepeat(PlayRepeat type) { playRepeat = type; video.put(VideoBoxKey.playRepeat, type.value); } void putDanmakuSettings() { - setting.put(SettingBoxKey.danmakuWeight, danmakuWeight); - setting.put(SettingBoxKey.danmakuBlockType, blockTypes); - setting.put(SettingBoxKey.danmakuShowArea, showArea); - setting.put(SettingBoxKey.danmakuOpacity, opacity); - setting.put(SettingBoxKey.danmakuFontScale, fontSize); - setting.put(SettingBoxKey.danmakuFontScaleFS, fontSizeFS); - setting.put(SettingBoxKey.danmakuDuration, danmakuDuration); - setting.put(SettingBoxKey.danmakuStaticDuration, danmakuStaticDuration); - setting.put(SettingBoxKey.strokeWidth, strokeWidth); - setting.put(SettingBoxKey.fontWeight, fontWeight); - setting.put(SettingBoxKey.danmakuLineHeight, danmakuLineHeight); + setting + ..put(SettingBoxKey.danmakuWeight, danmakuWeight) + ..put(SettingBoxKey.danmakuBlockType, blockTypes) + ..put(SettingBoxKey.danmakuShowArea, showArea) + ..put(SettingBoxKey.danmakuOpacity, opacity) + ..put(SettingBoxKey.danmakuFontScale, fontSize) + ..put(SettingBoxKey.danmakuFontScaleFS, fontSizeFS) + ..put(SettingBoxKey.danmakuDuration, danmakuDuration) + ..put(SettingBoxKey.danmakuStaticDuration, danmakuStaticDuration) + ..put(SettingBoxKey.strokeWidth, strokeWidth) + ..put(SettingBoxKey.fontWeight, fontWeight) + ..put(SettingBoxKey.danmakuLineHeight, danmakuLineHeight); } void putSubtitleSettings() { - setting.put(SettingBoxKey.subtitleFontScale, subtitleFontScale); - setting.put(SettingBoxKey.subtitleFontScaleFS, subtitleFontScaleFS); - setting.put(SettingBoxKey.subtitlePaddingH, subtitlePaddingH); - setting.put(SettingBoxKey.subtitlePaddingB, subtitlePaddingB); - setting.put(SettingBoxKey.subtitleBgOpaticy, subtitleBgOpaticy); - setting.put(SettingBoxKey.subtitleStrokeWidth, subtitleStrokeWidth); - setting.put(SettingBoxKey.subtitleFontWeight, subtitleFontWeight); + setting + ..put(SettingBoxKey.subtitleFontScale, subtitleFontScale) + ..put(SettingBoxKey.subtitleFontScaleFS, subtitleFontScaleFS) + ..put(SettingBoxKey.subtitlePaddingH, subtitlePaddingH) + ..put(SettingBoxKey.subtitlePaddingB, subtitlePaddingB) + ..put(SettingBoxKey.subtitleBgOpaticy, subtitleBgOpaticy) + ..put(SettingBoxKey.subtitleStrokeWidth, subtitleStrokeWidth) + ..put(SettingBoxKey.subtitleFontWeight, subtitleFontWeight); } Future dispose({String type = 'single'}) async { @@ -1541,7 +1579,7 @@ class PlPlayerController { late final RxBool showPreview = false.obs; late final RxDouble previewDx = 0.0.obs; - void getVideoShot() async { + Future getVideoShot() async { if (_isQueryingVideoShot) { return; } @@ -1571,7 +1609,7 @@ class PlPlayerController { } late final RxList dmTrend = [].obs; - late final RxBool showDmChart = true.obs; + late final RxBool showDmTreandChart = true.obs; } extension BoxFitExt on BoxFit { diff --git a/lib/plugin/pl_player/models/bottom_progress_behavior.dart b/lib/plugin/pl_player/models/bottom_progress_behavior.dart index 03082107..95e4de44 100644 --- a/lib/plugin/pl_player/models/bottom_progress_behavior.dart +++ b/lib/plugin/pl_player/models/bottom_progress_behavior.dart @@ -6,18 +6,13 @@ enum BtmProgressBehavior { } extension BtmProgresBehaviorDesc on BtmProgressBehavior { - String get description => ['始终展示', '始终隐藏', '仅全屏时展示', '仅全屏时隐藏'][index]; + String get description => const ['始终展示', '始终隐藏', '仅全屏时展示', '仅全屏时隐藏'][index]; } extension BtmProgresBehaviorCode on BtmProgressBehavior { - static final List _codeList = [0, 1, 2, 3]; - int get code => _codeList[index]; + int get code => index; - static BtmProgressBehavior? fromCode(int code) { - final index = _codeList.indexOf(code); - if (index != -1) { - return BtmProgressBehavior.values[index]; - } - return null; + static BtmProgressBehavior fromCode(int code) { + return BtmProgressBehavior.values[code]; } } diff --git a/lib/plugin/pl_player/models/fullscreen_mode.dart b/lib/plugin/pl_player/models/fullscreen_mode.dart index b7af5ce7..28312add 100644 --- a/lib/plugin/pl_player/models/fullscreen_mode.dart +++ b/lib/plugin/pl_player/models/fullscreen_mode.dart @@ -15,7 +15,7 @@ enum FullScreenMode { } extension FullScreenModeDesc on FullScreenMode { - String get description => [ + String get description => const [ '按视频方向(默认)', '不改变当前方向', '强制竖屏', @@ -26,14 +26,9 @@ extension FullScreenModeDesc on FullScreenMode { } extension FullScreenModeCode on FullScreenMode { - static final List _codeList = [0, 1, 2, 3, 4, 5]; - int get code => _codeList[index]; + int get code => index; - static FullScreenMode? fromCode(int code) { - final index = _codeList.indexOf(code); - if (index != -1) { - return FullScreenMode.values[index]; - } - return null; + static FullScreenMode fromCode(int code) { + return FullScreenMode.values[code]; } } diff --git a/lib/plugin/pl_player/models/play_repeat.dart b/lib/plugin/pl_player/models/play_repeat.dart index c614087d..8e327234 100644 --- a/lib/plugin/pl_player/models/play_repeat.dart +++ b/lib/plugin/pl_player/models/play_repeat.dart @@ -7,7 +7,7 @@ enum PlayRepeat { } extension PlayRepeatExtension on PlayRepeat { - static final List _descList = [ + static const List _descList = [ '播完暂停', '顺序播放', '单个循环', @@ -16,7 +16,7 @@ extension PlayRepeatExtension on PlayRepeat { ]; String get description => _descList[index]; - static final List _valueList = [ + static const List _valueList = [ 1, 2, 3, diff --git a/lib/plugin/pl_player/models/play_speed.dart b/lib/plugin/pl_player/models/play_speed.dart index 39a8898b..cb18435b 100644 --- a/lib/plugin/pl_player/models/play_speed.dart +++ b/lib/plugin/pl_player/models/play_speed.dart @@ -12,7 +12,7 @@ enum PlaySpeed { } extension PlaySpeedExtension on PlaySpeed { - static final List _descList = [ + static const List _descList = [ '0.5', '0.75', '正常', @@ -24,7 +24,7 @@ extension PlaySpeedExtension on PlaySpeed { ]; String get description => _descList[index]; - static final List _valueList = [ + static const List _valueList = [ 0.5, 0.75, 1.0, diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 99ad4d7a..eda4dd44 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'dart:math'; +import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart'; import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -138,7 +139,7 @@ class _PLVideoPlayerState extends State } // 双击播放、暂停 - void onDoubleTapCenter() async { + Future onDoubleTapCenter() async { if (plPlayerController.videoPlayerController!.state.completed) { await plPlayerController.videoPlayerController!.seek(Duration.zero); plPlayerController.videoPlayerController!.play(); @@ -372,13 +373,13 @@ class _PLVideoPlayerState extends State height: 30, alignment: Alignment.center, child: ComBtn( - icon: plPlayerController.showDmChart.value - ? Icon( + icon: plPlayerController.showDmTreandChart.value + ? const Icon( Icons.show_chart, size: 22, color: Colors.white, ) - : Stack( + : const Stack( clipBehavior: Clip.none, alignment: Alignment.center, children: [ @@ -395,8 +396,8 @@ class _PLVideoPlayerState extends State ], ), onTap: () { - plPlayerController.showDmChart.value = - !plPlayerController.showDmChart.value; + plPlayerController.showDmTreandChart.value = + !plPlayerController.showDmTreandChart.value; }, ), )), @@ -577,9 +578,9 @@ class _PLVideoPlayerState extends State onTap: () { widget.videoDetailController!.setSubtitle(0); }, - child: Text( + child: const Text( "关闭字幕", - style: const TextStyle(color: Colors.white), + style: TextStyle(color: Colors.white), ), ), ...widget.videoDetailController!.subtitles @@ -855,7 +856,8 @@ class _PLVideoPlayerState extends State padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6), + borderRadius: + const BorderRadius.all(Radius.circular(6)), color: theme.colorScheme.secondaryContainer, ), child: Text( @@ -869,12 +871,14 @@ class _PLVideoPlayerState extends State } } else { if (plPlayerController.cancelSeek == true) { - plPlayerController.cancelSeek = null; - plPlayerController.hasToast = null; + plPlayerController + ..cancelSeek = null + ..hasToast = null; } } - plPlayerController.onUpdatedSliderProgress(result); - plPlayerController.onChangedSliderStart(); + plPlayerController + ..onUpdatedSliderProgress(result) + ..onChangedSliderStart(); if (plPlayerController.showSeekPreview && plPlayerController.cancelSeek != true) { try { @@ -1099,9 +1103,9 @@ class _PLVideoPlayerState extends State duration: const Duration(milliseconds: 150), child: Container( alignment: Alignment.center, - decoration: BoxDecoration( - color: const Color(0x88000000), - borderRadius: BorderRadius.circular(16.0), + decoration: const BoxDecoration( + color: Color(0x88000000), + borderRadius: BorderRadius.all(Radius.circular(16)), ), height: 32.0, width: 70.0, @@ -1135,9 +1139,9 @@ class _PLVideoPlayerState extends State child: IntrinsicWidth( child: Container( alignment: Alignment.center, - decoration: BoxDecoration( - color: const Color(0x88000000), - borderRadius: BorderRadius.circular(64.0), + decoration: const BoxDecoration( + color: Color(0x88000000), + borderRadius: BorderRadius.all(Radius.circular(64)), ), height: 34.0, padding: const EdgeInsets.only(left: 10, right: 10), @@ -1189,9 +1193,9 @@ class _PLVideoPlayerState extends State child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 5), - decoration: BoxDecoration( - color: const Color(0x88000000), - borderRadius: BorderRadius.circular(64.0), + decoration: const BoxDecoration( + color: Color(0x88000000), + borderRadius: BorderRadius.all(Radius.circular(64)), ), child: Row( mainAxisSize: MainAxisSize.min, @@ -1235,9 +1239,9 @@ class _PLVideoPlayerState extends State child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 5), - decoration: BoxDecoration( - color: const Color(0x88000000), - borderRadius: BorderRadius.circular(64.0), + decoration: const BoxDecoration( + color: Color(0x88000000), + borderRadius: BorderRadius.all(Radius.circular(64)), ), child: Row( mainAxisSize: MainAxisSize.min, @@ -1317,52 +1321,51 @@ class _PLVideoPlayerState extends State // ), Obx( - () => - showRestoreScaleBtn.value && plPlayerController.showControls.value - ? Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.only(bottom: 95), - child: FilledButton.tonal( - style: FilledButton.styleFrom( - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - backgroundColor: theme - .colorScheme.secondaryContainer - .withOpacity(0.8), - visualDensity: - VisualDensity(horizontal: -2, vertical: -2), - padding: const EdgeInsets.all(15), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), - ), - ), - onPressed: () async { - showRestoreScaleBtn.value = false; - final animController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 255), - ); - final anim = Matrix4Tween( - begin: transformationController.value, - end: Matrix4.identity(), - ).animate( - CurveTween(curve: Curves.easeOut) - .animate(animController), - ); - void listener() { - transformationController.value = anim.value; - } - - animController.addListener(listener); - await animController.forward(from: 0); - animController.removeListener(listener); - animController.dispose(); - }, - child: Text('还原屏幕'), + () => showRestoreScaleBtn.value && + plPlayerController.showControls.value + ? Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 95), + child: FilledButton.tonal( + style: FilledButton.styleFrom( + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + backgroundColor: theme.colorScheme.secondaryContainer + .withOpacity(0.8), + visualDensity: VisualDensity.compact, + padding: const EdgeInsets.all(15), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6)), ), ), - ) - : const SizedBox.shrink(), + onPressed: () async { + showRestoreScaleBtn.value = false; + final animController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 255), + ); + final anim = Matrix4Tween( + begin: transformationController.value, + end: Matrix4.identity(), + ).animate( + CurveTween(curve: Curves.easeOut) + .animate(animController), + ); + void listener() { + transformationController.value = anim.value; + } + + animController.addListener(listener); + await animController.forward(from: 0); + animController + ..removeListener(listener) + ..dispose(); + }, + child: const Text('还原屏幕'), + ), + ), + ) + : const SizedBox.shrink(), ), /// 进度条 live模式下禁用 @@ -1407,7 +1410,7 @@ class _PLVideoPlayerState extends State alignment: Alignment.bottomCenter, children: [ if (plPlayerController.dmTrend.isNotEmpty && - plPlayerController.showDmChart.value) + plPlayerController.showDmTreandChart.value) buildDmChart(theme, plPlayerController), if (plPlayerController.viewPointList.isNotEmpty && plPlayerController.showVP.value) @@ -1459,7 +1462,7 @@ class _PLVideoPlayerState extends State bottom: 0.75, child: IgnorePointer( child: CustomPaint( - size: Size(double.infinity, 3.5), + size: const Size(double.infinity, 3.5), painter: SegmentProgressBar( segmentColors: plPlayerController.segmentList, ), @@ -1474,7 +1477,7 @@ class _PLVideoPlayerState extends State bottom: 0.75, child: IgnorePointer( child: CustomPaint( - size: Size(double.infinity, 3.5), + size: const Size(double.infinity, 3.5), painter: SegmentProgressBar( segmentColors: plPlayerController.viewPointList, ), @@ -1517,9 +1520,9 @@ class _PLVideoPlayerState extends State visible: plPlayerController.showControls.value && (isFullScreen || plPlayerController.controlsLock.value), child: DecoratedBox( - decoration: BoxDecoration( - color: const Color(0x45000000), - borderRadius: BorderRadius.circular(8), + decoration: const BoxDecoration( + color: Color(0x45000000), + borderRadius: BorderRadius.all(Radius.circular(8)), ), child: ComBtn( icon: Icon( @@ -1554,9 +1557,9 @@ class _PLVideoPlayerState extends State visible: plPlayerController.showControls.value && isFullScreen, child: DecoratedBox( - decoration: BoxDecoration( - color: const Color(0x45000000), - borderRadius: BorderRadius.circular(8), + decoration: const BoxDecoration( + color: Color(0x45000000), + borderRadius: BorderRadius.all(Radius.circular(8)), ), child: ComBtn( icon: const Icon( @@ -1700,11 +1703,12 @@ class _PLVideoPlayerState extends State Duration.zero, player.state.duration, ); - plPlayerController.seekTo( - result, - type: 'slider', - ); - plPlayerController.play(); + plPlayerController + ..seekTo( + result, + type: 'slider', + ) + ..play(); }, ), ), @@ -1731,11 +1735,12 @@ class _PLVideoPlayerState extends State Duration.zero, player.state.duration, ); - plPlayerController.seekTo( - result, - type: 'slider', - ); - plPlayerController.play(); + plPlayerController + ..seekTo( + result, + type: 'slider', + ) + ..play(); }, ), ), @@ -1871,7 +1876,9 @@ Widget buildSeekPreviewWidget(PlPlayerController plPlayerController) { padding: EdgeInsets.only(left: left), child: UnconstrainedBox( child: ClipRRect( - borderRadius: BorderRadius.circular(scale == 2.5 ? 6 : 10), + borderRadius: scale == 2.5 + ? const BorderRadius.all(Radius.circular(6)) + : StyleString.mdRadius, child: Align( widthFactor: 0.1, heightFactor: 0.1, diff --git a/lib/plugin/pl_player/widgets/bottom_control.dart b/lib/plugin/pl_player/widgets/bottom_control.dart index 109f3f56..02997f3e 100644 --- a/lib/plugin/pl_player/widgets/bottom_control.dart +++ b/lib/plugin/pl_player/widgets/bottom_control.dart @@ -52,7 +52,7 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { alignment: Alignment.bottomCenter, children: [ if (controller.dmTrend.isNotEmpty && - controller.showDmChart.value) + controller.showDmTreandChart.value) buildDmChart(theme, controller, 4.5), if (controller.viewPointList.isNotEmpty && controller.showVP.value) @@ -99,12 +99,11 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { if (controller.showSeekPreview) { controller.showPreview.value = false; } - controller.onChangedSliderEnd(); controller - .onChangedSlider(duration.inSeconds.toDouble()); - controller.seekTo( - Duration(seconds: duration.inSeconds), - type: 'slider'); + ..onChangedSliderEnd() + ..onChangedSlider(duration.inSeconds.toDouble()) + ..seekTo(Duration(seconds: duration.inSeconds), + type: 'slider'); SemanticsService.announce( "${(duration.inSeconds / max * 100).round()}%", TextDirection.ltr); @@ -117,7 +116,7 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { bottom: 5.25, child: IgnorePointer( child: CustomPaint( - size: Size(double.infinity, 3.5), + size: const Size(double.infinity, 3.5), painter: SegmentProgressBar( segmentColors: controller.segmentList, ), @@ -132,7 +131,7 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { bottom: 5.25, child: IgnorePointer( child: CustomPaint( - size: Size(double.infinity, 3.5), + size: const Size(double.infinity, 3.5), painter: SegmentProgressBar( segmentColors: controller.viewPointList, ), diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index f2cc3666..61d3afc7 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -33,7 +33,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { revalidateSetting(); } - revalidateSetting() { + void revalidateSetting() { enableBackgroundPlay = GStorage.setting .get(SettingBoxKey.enableBackgroundPlay, defaultValue: true); } @@ -105,14 +105,14 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { )); } - onStatusChange(PlayerStatus status, bool isBuffering, isLive) { + void onStatusChange(PlayerStatus status, bool isBuffering, isLive) { if (!enableBackgroundPlay) return; if (_item.isEmpty) return; setPlaybackState(status, isBuffering, isLive); } - onVideoDetailChange(dynamic data, int cid, String herotag) { + void onVideoDetailChange(dynamic data, int cid, String herotag) { if (!enableBackgroundPlay) return; // debugPrint('当前调用栈为:'); // debugPrint(StackTrace.current); @@ -168,7 +168,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { setMediaItem(mediaItem); } - onVideoDetailDispose(String herotag) { + void onVideoDetailDispose(String herotag) { if (!enableBackgroundPlay) return; if (_item.isNotEmpty) { @@ -184,7 +184,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { } } - clear() { + void clear() { if (!enableBackgroundPlay) return; mediaItem.add(null); _item.clear(); @@ -206,7 +206,7 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler { )); } - onPositionChange(Duration position) { + void onPositionChange(Duration position) { if (!enableBackgroundPlay || _item.isEmpty || PlPlayerController.instanceExists().not) return; diff --git a/lib/services/audio_session.dart b/lib/services/audio_session.dart index 6978f592..792bd66f 100644 --- a/lib/services/audio_session.dart +++ b/lib/services/audio_session.dart @@ -6,7 +6,7 @@ class AudioSessionHandler { late AudioSession session; bool _playInterrupted = false; - setActive(bool active) { + void setActive(bool active) { session.setActive(active); } diff --git a/lib/services/loggeer.dart b/lib/services/loggeer.dart index 15cc8ba1..8bc0ca67 100644 --- a/lib/services/loggeer.dart +++ b/lib/services/loggeer.dart @@ -1,5 +1,3 @@ -// final _loggerFactory = - import 'dart:io'; import 'package:flutter/material.dart'; @@ -17,7 +15,7 @@ class PiliLogger extends Logger { PiliLogger() : super(); @override - void log(Level level, dynamic message, + Future log(Level level, dynamic message, {Object? error, StackTrace? stackTrace, DateTime? time}) async { if (level == Level.error || level == Level.fatal) { // 添加至文件末尾 @@ -35,7 +33,7 @@ Future getLogsPath() async { String dir = (await getApplicationDocumentsDirectory()).path; final String filename = p.join(dir, ".pili_logs"); final File file = File(filename); - if (!await file.exists()) { + if (!file.existsSync()) { await file.create(recursive: true); } return file; diff --git a/lib/services/service_locator.dart b/lib/services/service_locator.dart index e4497660..beaa798e 100644 --- a/lib/services/service_locator.dart +++ b/lib/services/service_locator.dart @@ -1,5 +1,5 @@ -import 'audio_handler.dart'; -import 'audio_session.dart'; +import 'package:PiliPlus/services/audio_handler.dart'; +import 'package:PiliPlus/services/audio_session.dart'; late VideoPlayerServiceHandler videoPlayerServiceHandler; late AudioSessionHandler audioSessionHandler; diff --git a/lib/tcp/live.dart b/lib/tcp/live.dart index a6c5b06d..67301417 100644 --- a/lib/tcp/live.dart +++ b/lib/tcp/live.dart @@ -29,24 +29,22 @@ class PackageHeader { }); Uint8List toBytes() { - final buffer = BytesBuilder(); - buffer.add(_int32ToBytes(totalSize)); - buffer.add(_int16ToBytes(headerSize)); - buffer.add(_int16ToBytes(protocolVer)); - buffer.add(_int32ToBytes(operationCode)); - buffer.add(_int32ToBytes(seq)); + final buffer = BytesBuilder() + ..add(_int32ToBytes(totalSize)) + ..add(_int16ToBytes(headerSize)) + ..add(_int16ToBytes(protocolVer)) + ..add(_int32ToBytes(operationCode)) + ..add(_int32ToBytes(seq)); return buffer.toBytes(); } List _int32ToBytes(int value) { - final bytes = ByteData(4); - bytes.setInt32(0, value, Endian.big); + final bytes = ByteData(4)..setInt32(0, value, Endian.big); return bytes.buffer.asUint8List(); } List _int16ToBytes(int value) { - final bytes = ByteData(2); - bytes.setInt16(0, value, Endian.big); + final bytes = ByteData(2)..setInt16(0, value, Endian.big); return bytes.buffer.asUint8List(); } @@ -131,9 +129,9 @@ class AuthPackage extends AbstractPackage { header.headerSize = 0x10; // 固定大小 size += header.headerSize; header.totalSize = size; - final buffer = BytesBuilder(); - buffer.add(header.toBytes()); - buffer.add(utf8.encode(body.toJsonStr())); + final buffer = BytesBuilder() + ..add(header.toBytes()) + ..add(utf8.encode(body.toJsonStr())); return buffer.toBytes(); } } @@ -145,8 +143,9 @@ class HeartbeatPackage extends AbstractPackage { @override Uint8List marshal() { final buffer = BytesBuilder(); - header.headerSize = 0x10; - header.totalSize = 0x10; + header + ..headerSize = 0x10 + ..totalSize = 0x10; buffer.add(header.toBytes()); return buffer.toBytes(); } @@ -170,7 +169,7 @@ class LiveMessageStream { PiliLogger logger = getLogger(); final String logTag = "LiveStreamService"; - void init() async { + Future init() async { final authPackage = AuthPackage( header: PackageHeader( totalSize: 0, @@ -264,7 +263,7 @@ class LiveMessageStream { } } - void _heartBeat() async { + Future _heartBeat() async { logger.i("$logTag 直播间信息流认证成功"); int heartBeatCount = 1; while (heartBeat) { @@ -290,7 +289,7 @@ class LiveMessageStream { eventListeners.add(func); } - void close() async { + Future close() async { heartBeat = false; eventListeners.clear(); _socketSubscription?.cancel(); diff --git a/lib/utils/accounts/account.dart b/lib/utils/accounts/account.dart index 25be0857..19e1511f 100644 --- a/lib/utils/accounts/account.dart +++ b/lib/utils/accounts/account.dart @@ -72,7 +72,7 @@ class LoginAccount implements Account { LoginAccount(this.cookieJar, this.accessKey, this.refresh, [Set? type]) - : this.type = type ?? {}; + : type = type ?? {}; LoginAccount.fromJson(Map json) { cookieJar = BiliCookieJar.fromJson(json['cookies']); diff --git a/lib/utils/accounts/account_manager/account_mgr.dart b/lib/utils/accounts/account_manager/account_mgr.dart index 0bc286e3..451261c8 100644 --- a/lib/utils/accounts/account_manager/account_mgr.dart +++ b/lib/utils/accounts/account_manager/account_mgr.dart @@ -16,7 +16,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; final _setCookieReg = RegExp('(?<=)(,)(?=[^;]+?=)'); class AccountManager extends Interceptor { - static final Map> apiTypeSet = { + static const Map> apiTypeSet = { AccountType.heartbeat: { Api.videoIntro, Api.replyList, @@ -53,7 +53,7 @@ class AccountManager extends Interceptor { AccountType.video: {Api.videoUrl, Api.bangumiVideoUrl} }; - static final loginApi = { + static const loginApi = { Api.getTVCode, Api.qrcodePoll, Api.getCaptcha, diff --git a/lib/utils/accounts/cookie_jar_adapter.dart b/lib/utils/accounts/cookie_jar_adapter.dart index 14f83a67..3a802e09 100644 --- a/lib/utils/accounts/cookie_jar_adapter.dart +++ b/lib/utils/accounts/cookie_jar_adapter.dart @@ -1,7 +1,7 @@ import 'package:cookie_jar/cookie_jar.dart'; import 'package:hive/hive.dart'; -import 'account.dart'; +import 'package:PiliPlus/utils/accounts/account.dart'; class BiliCookieJarAdapter extends TypeAdapter { @override diff --git a/lib/utils/data.dart b/lib/utils/data.dart index 002bea9e..0c9d453b 100644 --- a/lib/utils/data.dart +++ b/lib/utils/data.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/http/user.dart'; -import 'storage.dart'; +import 'package:PiliPlus/utils/storage.dart'; class Data { static Future init() async { diff --git a/lib/utils/download.dart b/lib/utils/download.dart index aee36b58..51b84191 100644 --- a/lib/utils/download.dart +++ b/lib/utils/download.dart @@ -16,7 +16,7 @@ import 'package:share_plus/share_plus.dart'; class DownloadUtils { // 图片分享 - static void onShareImg(String imgUrl) async { + static Future onShareImg(String imgUrl) async { try { SmartDialog.showLoading(); var response = await Request() diff --git a/lib/utils/extension.dart b/lib/utils/extension.dart index 1faff43e..64bede94 100644 --- a/lib/utils/extension.dart +++ b/lib/utils/extension.dart @@ -145,8 +145,8 @@ extension RationalExt on Rational { /// Android docs specified boundaries as inclusive. bool get fitsInAndroidRequirements { final aspectRatio = numerator / denominator; - final min = 1 / 2.39; - final max = 2.39; + const min = 1 / 2.39; + const max = 2.39; return (min <= aspectRatio) && (aspectRatio <= max); } } diff --git a/lib/utils/feed_back.dart b/lib/utils/feed_back.dart index 6219abef..0ced7744 100644 --- a/lib/utils/feed_back.dart +++ b/lib/utils/feed_back.dart @@ -1,11 +1,9 @@ import 'package:flutter/services.dart'; -import 'storage.dart'; +import 'package:PiliPlus/utils/storage.dart'; +bool enableFeedback = GStorage.feedBackEnable; void feedBack() { - // 设置中是否开启 - final bool enable = GStorage.setting - .get(SettingBoxKey.feedBackEnable, defaultValue: false) as bool; - if (enable) { + if (enableFeedback) { HapticFeedback.lightImpact(); } } diff --git a/lib/utils/grid.dart b/lib/utils/grid.dart index 159e24f7..3cdebc7c 100644 --- a/lib/utils/grid.dart +++ b/lib/utils/grid.dart @@ -3,12 +3,13 @@ import 'dart:math'; import 'package:PiliPlus/common/constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -import 'storage.dart'; +import 'package:PiliPlus/utils/storage.dart'; class Grid { static double smallCardWidth = GStorage.smallCardWidth; - static videoCardHDelegate(context, {double minHeight = 90}) => + static SliverGridDelegateWithExtentAndRatio videoCardHDelegate(context, + {double minHeight = 90}) => SliverGridDelegateWithExtentAndRatio( mainAxisSpacing: 2, maxCrossAxisExtent: Grid.smallCardWidth * 2, diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index ea070173..9930bf1c 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -28,7 +28,8 @@ import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; class PageUtils { - static void pmShare(BuildContext context, {required Map content}) async { + static Future pmShare(BuildContext context, + {required Map content}) async { // debugPrint(content.toString()); List userList = []; @@ -155,7 +156,7 @@ class PageUtils { .startShutdownTimer(); setState(() {}); }, - child: Text('确定'), + child: const Text('确定'), ), ], ); @@ -168,7 +169,7 @@ class PageUtils { shutdownTimerService.startShutdownTimer(); } }, - contentPadding: const EdgeInsets.only(), + contentPadding: EdgeInsets.zero, title: Text(choice == -1 ? '自定义' : choice == 0 @@ -199,7 +200,7 @@ class PageUtils { !shutdownTimerService.waitForPlayingCompleted; setState(() {}); }, - contentPadding: const EdgeInsets.only(), + contentPadding: EdgeInsets.zero, title: const Text("额外等待视频播放完毕", style: titleStyle), trailing: Transform.scale( alignment: Alignment.centerRight, @@ -342,7 +343,7 @@ class PageUtils { ); } - static void pushDynDetail(DynamicItemModel item, floor, + static Future pushDynDetail(DynamicItemModel item, floor, {action = 'all'}) async { feedBack(); @@ -553,7 +554,7 @@ class PageUtils { } } - static launchURL(String url) async { + static Future launchURL(String url) async { try { final Uri uri = Uri.parse(url); if (!await launchUrl( @@ -567,7 +568,7 @@ class PageUtils { } } - static void handleWebview( + static Future handleWebview( String url, { bool off = false, bool inApp = false, @@ -629,8 +630,8 @@ class PageUtils { transitionBuilder: (context, animation, secondaryAnimation, child) { Offset begin = MediaQuery.orientationOf(Get.context!) == Orientation.portrait - ? Offset(0.0, 1.0) - : Offset(1.0, 0.0); + ? const Offset(0.0, 1.0) + : const Offset(1.0, 0.0); var tween = Tween(begin: begin, end: Offset.zero) .chain(CurveTween(curve: Curves.easeInOut)); return SlideTransition( @@ -683,7 +684,7 @@ class PageUtils { return false; } - static void viewBangumi( + static Future viewBangumi( {dynamic seasonId, dynamic epId, dynamic progress}) async { try { SmartDialog.showLoading(msg: '资源获取中'); diff --git a/lib/utils/proxy.dart b/lib/utils/proxy.dart index cba74c42..cdb0b629 100644 --- a/lib/utils/proxy.dart +++ b/lib/utils/proxy.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:system_proxy/system_proxy.dart'; class CustomProxy { - init() async { + Future init() async { Map? proxy = await SystemProxy.getProxySettings(); if (proxy != null) { HttpOverrides.global = diff --git a/lib/utils/recommend_filter.dart b/lib/utils/recommend_filter.dart index 336c18a8..7804879b 100644 --- a/lib/utils/recommend_filter.dart +++ b/lib/utils/recommend_filter.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/models/model_video.dart'; import 'package:hive/hive.dart'; -import 'storage.dart'; +import 'package:PiliPlus/utils/storage.dart'; class RecommendFilter { static late int minDurationForRcmd; diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index 7a5790cb..268c2a7b 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -294,7 +294,7 @@ class RequestUtils { showDialog( context: Get.context!, builder: (context) => AlertDialog( - title: Text('动态检查结果'), + title: const Text('动态检查结果'), content: SelectableText( '${res['status'] ? '无账号状态下找到了你的动态,动态正常!' : '你的动态被shadow ban(仅自己可见)!'}${dynText != null ? ' \n\n动态内容: $dynText' : ''}'), ), @@ -422,7 +422,7 @@ class RequestUtils { }); } }, - child: Text('确认'), + child: const Text('确认'), ), ], ); @@ -470,107 +470,106 @@ class RequestUtils { success: true, ); - final Gt3FlutterPlugin captcha = Gt3FlutterPlugin(); - - captcha.addEventHandler( - onClose: (Map message) async { - SmartDialog.showToast('关闭验证'); - }, - onResult: (Map message) async { - debugPrint("Captcha result: $message"); - String code = message["code"]; - if (code == "1") { - // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 - SmartDialog.showToast('验证成功'); - captchaData.validate = message['result']?['geetest_validate']; - captchaData.seccode = message['result']?['geetest_seccode']; - String? challenge = message['result']?['geetest_challenge']; - final res = await ValidateHttp.gaiaVgateValidate( - challenge: challenge, - seccode: captchaData.seccode, - token: captchaData.token, - validate: captchaData.validate, - ); - if (res['status']) { - if (res['data']?['is_valid'] == 1) { - final griskId = res['data']?['grisk_id']; - if (griskId != null) { - onSuccess(griskId); + Gt3FlutterPlugin() + ..addEventHandler( + onClose: (Map message) async { + SmartDialog.showToast('关闭验证'); + }, + onResult: (Map message) async { + debugPrint("Captcha result: $message"); + String code = message["code"]; + if (code == "1") { + // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 + SmartDialog.showToast('验证成功'); + captchaData + ..validate = message['result']?['geetest_validate'] + ..seccode = message['result']?['geetest_seccode']; + String? challenge = message['result']?['geetest_challenge']; + final res = await ValidateHttp.gaiaVgateValidate( + challenge: challenge, + seccode: captchaData.seccode, + token: captchaData.token, + validate: captchaData.validate, + ); + if (res['status']) { + if (res['data']?['is_valid'] == 1) { + final griskId = res['data']?['grisk_id']; + if (griskId != null) { + onSuccess(griskId); + } + } else { + SmartDialog.showToast('invalid'); } } else { - SmartDialog.showToast('invalid'); + SmartDialog.showToast(res['msg']); } } else { - SmartDialog.showToast(res['msg']); + // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. + debugPrint("Captcha result code : $code"); } - } else { - // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. - debugPrint("Captcha result code : $code"); - } - }, - onError: (Map message) async { - SmartDialog.showToast("Captcha onError: $message"); - String code = message["code"]; - // 处理验证中返回的错误 Handling errors returned in verification - if (Platform.isAndroid) { - // Android 平台 - if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else if (code == "201") { - // 网络无法访问 Network inaccessible - } else if (code == "202") { - // Json 解析错误 Analysis error - } else if (code == "204") { - // WebView 加载超时,请检查是否混淆极验 SDK Load timed out - } else if (code == "204_1") { - // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log - } else if (code == "204_2") { - // WebView 加载 SSLError - } else if (code == "206") { - // gettype 接口错误或返回为 null API error or return null - } else if (code == "207") { - // getphp 接口错误或返回为 null API error or return null - } else if (code == "208") { - // ajax 接口错误或返回为 null API error or return null - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/android + }, + onError: (Map message) async { + SmartDialog.showToast("Captcha onError: $message"); + String code = message["code"]; + // 处理验证中返回的错误 Handling errors returned in verification + if (Platform.isAndroid) { + // Android 平台 + if (code == "-2") { + // Dart 调用异常 Call exception + } else if (code == "-1") { + // Gt3RegisterData 参数不合法 Parameter is invalid + } else if (code == "201") { + // 网络无法访问 Network inaccessible + } else if (code == "202") { + // Json 解析错误 Analysis error + } else if (code == "204") { + // WebView 加载超时,请检查是否混淆极验 SDK Load timed out + } else if (code == "204_1") { + // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log + } else if (code == "204_2") { + // WebView 加载 SSLError + } else if (code == "206") { + // gettype 接口错误或返回为 null API error or return null + } else if (code == "207") { + // getphp 接口错误或返回为 null API error or return null + } else if (code == "208") { + // ajax 接口错误或返回为 null API error or return null + } else { + // 更多错误码参考开发文档 More error codes refer to the development document + // https://docs.geetest.com/sensebot/apirefer/errorcode/android + } } - } - if (Platform.isIOS) { - // iOS 平台 - if (code == "-1009") { - // 网络无法访问 Network inaccessible - } else if (code == "-1004") { - // 无法查找到 HOST Unable to find HOST - } else if (code == "-1002") { - // 非法的 URL Illegal URL - } else if (code == "-1001") { - // 网络超时 Network timeout - } else if (code == "-999") { - // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation - } else if (code == "-21") { - // 使用了重复的 challenge Duplicate challenges are used - // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached - } else if (code == "-20") { - // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again - } else if (code == "-10") { - // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification - } else if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/ios + if (Platform.isIOS) { + // iOS 平台 + if (code == "-1009") { + // 网络无法访问 Network inaccessible + } else if (code == "-1004") { + // 无法查找到 HOST Unable to find HOST + } else if (code == "-1002") { + // 非法的 URL Illegal URL + } else if (code == "-1001") { + // 网络超时 Network timeout + } else if (code == "-999") { + // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation + } else if (code == "-21") { + // 使用了重复的 challenge Duplicate challenges are used + // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached + } else if (code == "-20") { + // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again + } else if (code == "-10") { + // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification + } else if (code == "-2") { + // Dart 调用异常 Call exception + } else if (code == "-1") { + // Gt3RegisterData 参数不合法 Parameter is invalid + } else { + // 更多错误码参考开发文档 More error codes refer to the development document + // https://docs.geetest.com/sensebot/apirefer/errorcode/ios + } } - } - }, - ); - - captcha.startCaptcha(registerData); + }, + ) + ..startCaptcha(registerData); } } diff --git a/lib/utils/storage.dart b/lib/utils/storage.dart index 80b111ee..3f78a01a 100644 --- a/lib/utils/storage.dart +++ b/lib/utils/storage.dart @@ -34,7 +34,7 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:path_provider/path_provider.dart'; import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models/user/info.dart'; -import 'global_data.dart'; +import 'package:PiliPlus/utils/global_data.dart'; import 'package:uuid/uuid.dart'; class GStorage { @@ -47,7 +47,7 @@ class GStorage { static List get speedList => List.from( video.get( VideoBoxKey.speedsList, - defaultValue: [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 3.0], + defaultValue: const [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 3.0], ), ); @@ -226,7 +226,7 @@ class GStorage { String blockUserID = setting.get(SettingBoxKey.blockUserID, defaultValue: ''); if (blockUserID.isEmpty) { - blockUserID = Uuid().v4().replaceAll('-', ''); + blockUserID = const Uuid().v4().replaceAll('-', ''); setting.put(SettingBoxKey.blockUserID, blockUserID); } return blockUserID; @@ -475,7 +475,7 @@ class GStorage { GStorage.setting.get(SettingBoxKey.optTabletNav, defaultValue: true); static List get dynamicDetailRatio => List.from(setting - .get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0])); + .get(SettingBoxKey.dynamicDetailRatio, defaultValue: const [60.0, 40.0])); static Set get blackMids => GStorage.localCache.get(LocalCacheKey.blackMids, defaultValue: {}); @@ -583,29 +583,35 @@ class GStorage { } static void regAdapter() { - Hive.registerAdapter(OwnerAdapter()); - Hive.registerAdapter(UserInfoDataAdapter()); - Hive.registerAdapter(LevelInfoAdapter()); - Hive.registerAdapter(BiliCookieJarAdapter()); - Hive.registerAdapter(LoginAccountAdapter()); - Hive.registerAdapter(AccountTypeAdapter()); - Hive.registerAdapter(SetIntAdapter()); - Hive.registerAdapter(RuleFilterAdapter()); + Hive + ..registerAdapter(OwnerAdapter()) + ..registerAdapter(UserInfoDataAdapter()) + ..registerAdapter(LevelInfoAdapter()) + ..registerAdapter(BiliCookieJarAdapter()) + ..registerAdapter(LoginAccountAdapter()) + ..registerAdapter(AccountTypeAdapter()) + ..registerAdapter(SetIntAdapter()) + ..registerAdapter(RuleFilterAdapter()); } static Future close() async { // user.compact(); // user.close(); - userInfo.compact(); - userInfo.close(); - historyWord.compact(); - historyWord.close(); - localCache.compact(); - localCache.close(); - setting.compact(); - setting.close(); - video.compact(); - video.close(); + userInfo + ..compact() + ..close(); + historyWord + ..compact() + ..close(); + localCache + ..compact() + ..close(); + setting + ..compact() + ..close(); + video + ..compact() + ..close(); Accounts.close(); } } @@ -877,7 +883,7 @@ class Accounts { final Directory tempDir = await getApplicationSupportDirectory(); final String tempPath = "${tempDir.path}/.plpl/"; final Directory dir = Directory(tempPath); - if (await dir.exists()) { + if (dir.existsSync()) { debugPrint('migrating...'); final cookieJar = PersistCookieJar(ignoreExpires: true, storage: FileStorage(tempPath)); @@ -928,8 +934,9 @@ class Accounts { } static Future close() async { - account.compact(); - account.close(); + account + ..compact() + ..close(); } static Future deleteAll(Set accounts) async { diff --git a/lib/utils/theme_utils.dart b/lib/utils/theme_utils.dart index b4bdee7d..ab6aa38b 100644 --- a/lib/utils/theme_utils.dart +++ b/lib/utils/theme_utils.dart @@ -110,7 +110,7 @@ class ThemeUtils { return themeData; } - static darkenTheme(ThemeData themeData) { + static ThemeData darkenTheme(ThemeData themeData) { Color color = themeData.colorScheme.surfaceContainerHighest.darken(0.7); return themeData.copyWith( scaffoldBackgroundColor: Colors.black, diff --git a/lib/utils/url_utils.dart b/lib/utils/url_utils.dart index 8c67d4da..faab5304 100644 --- a/lib/utils/url_utils.dart +++ b/lib/utils/url_utils.dart @@ -41,7 +41,7 @@ class UrlUtils { } // 匹配url路由跳转 - static matchUrlPush( + static Future matchUrlPush( String pathSegment, String redirectUrl, ) async { diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 8549a315..fd2eae84 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -69,7 +69,7 @@ class Utils { return _isIpad!; } - static void shareText(String text) async { + static Future shareText(String text) async { try { Rect? sharePositionOrigin; if (await isIpad()) { @@ -275,11 +275,12 @@ class Utils { semanticsLabel.write(videoItem.title); if (!emptyStatCheck(videoItem.stat.view)) { - semanticsLabel.write(',${Utils.numFormat(videoItem.stat.view)}'); - semanticsLabel.write( - (videoItem is RecVideoItemAppModel && videoItem.goto == 'picture') - ? '浏览' - : '播放'); + semanticsLabel + ..write(',${Utils.numFormat(videoItem.stat.view)}') + ..write( + (videoItem is RecVideoItemAppModel && videoItem.goto == 'picture') + ? '浏览' + : '播放'); } if (!emptyStatCheck(videoItem.stat.danmu)) { semanticsLabel.write(',${Utils.numFormat(videoItem.stat.danmu)}弹幕'); @@ -494,7 +495,7 @@ class Utils { } // 检查更新 - static Future checkUpdate([bool isAuto = true]) async { + static Future checkUpdate([bool isAuto = true]) async { if (BuildConfig.isDebug) return; SmartDialog.dismiss(); try { diff --git a/lib/utils/wbi_sign.dart b/lib/utils/wbi_sign.dart index 96b8bd74..c911c9c4 100644 --- a/lib/utils/wbi_sign.dart +++ b/lib/utils/wbi_sign.dart @@ -88,8 +88,9 @@ class WbiSign { Utils.getFileName(wbiUrls['img_url'], fileExt: false) + Utils.getFileName(wbiUrls['sub_url'], fileExt: false)); - localCache.put(LocalCacheKey.mixinKey, mixinKey); - localCache.put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch); + localCache + ..put(LocalCacheKey.mixinKey, mixinKey) + ..put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch); return mixinKey; } catch (_) { diff --git a/pubspec.lock b/pubspec.lock index 0ae33bee..ebf6039d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -579,7 +579,7 @@ packages: source: hosted version: "0.9.3+4" fixnum: - dependency: transitive + dependency: "direct main" description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be @@ -1032,7 +1032,7 @@ packages: source: hosted version: "0.6.7" json_annotation: - dependency: transitive + dependency: "direct main" description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" @@ -1233,7 +1233,7 @@ packages: source: hosted version: "1.15.0" mime: - dependency: "direct overridden" + dependency: "direct main" description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" @@ -1289,7 +1289,7 @@ packages: source: hosted version: "3.2.0" path: - dependency: "direct overridden" + dependency: "direct main" description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" @@ -1521,7 +1521,7 @@ packages: source: hosted version: "4.0.1" screen_brightness: - dependency: "direct overridden" + dependency: "direct main" description: name: screen_brightness sha256: eca7bd9d2c3c688bcad14855361cab7097839400b6b4a56f62b7ae511c709958 @@ -1767,7 +1767,7 @@ packages: source: hosted version: "2.1.2" stream_transform: - dependency: transitive + dependency: "direct main" description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 @@ -1839,7 +1839,7 @@ packages: source: hosted version: "2.2.2" universal_platform: - dependency: transitive + dependency: "direct main" description: name: universal_platform sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" @@ -1951,7 +1951,7 @@ packages: source: hosted version: "1.1.16" vector_math: - dependency: transitive + dependency: "direct main" description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" diff --git a/pubspec.yaml b/pubspec.yaml index 4ba181cb..c66c4ebc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -193,6 +193,15 @@ dependencies: re_highlight: ^0.0.3 cached_network_svg_image: ^1.2.0 + vector_math: any + fixnum: any + json_annotation: any + stream_transform: any + screen_brightness: any + mime: any + universal_platform: any + path: any + dependency_overrides: screen_brightness: ^2.0.1 path: 1.9.1 @@ -281,9 +290,9 @@ flutter: # - family: Jura-Bold # fonts: # - asset: assets/fonts/Jura-Bold.ttf - # - family: HarmonyOS - # fonts: - # - asset: assets/fonts/HarmonyOS_Sans_SC_Regular.ttf + # - family: HarmonyOS + # fonts: + # - asset: assets/fonts/HarmonyOS_Sans_SC_Regular.ttf # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages