* mod: pgc episode title

* opt: ColorScheme.of

* mod: mpv api version

* opt: log handler

* opt: ext
This commit is contained in:
My-Responsitories
2026-05-15 01:59:54 +00:00
committed by GitHub
parent 24769e144f
commit b33fdf14af
30 changed files with 99 additions and 191 deletions

View File

@@ -16,7 +16,7 @@ class ToolbarIconButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context); final colorScheme = ColorScheme.of(context);
return SizedBox( return SizedBox(
width: 36, width: 36,
height: 36, height: 36,
@@ -24,14 +24,14 @@ class ToolbarIconButton extends StatelessWidget {
tooltip: tooltip, tooltip: tooltip,
onPressed: onPressed, onPressed: onPressed,
icon: icon, icon: icon,
highlightColor: theme.colorScheme.secondaryContainer, highlightColor: colorScheme.secondaryContainer,
color: selected color: selected
? theme.colorScheme.onSecondaryContainer ? colorScheme.onSecondaryContainer
: theme.colorScheme.outline, : colorScheme.outline,
style: ButtonStyle( style: ButtonStyle(
padding: const WidgetStatePropertyAll(EdgeInsets.zero), padding: const WidgetStatePropertyAll(EdgeInsets.zero),
backgroundColor: WidgetStatePropertyAll( backgroundColor: WidgetStatePropertyAll(
selected ? theme.colorScheme.secondaryContainer : null, selected ? colorScheme.secondaryContainer : null,
), ),
), ),
), ),

View File

@@ -69,12 +69,12 @@ Future<void> importFromClipBoard<T>(
executeImport = await showDialog<bool>( executeImport = await showDialog<bool>(
context: context, context: context,
builder: (context) { builder: (context) {
final theme = Theme.of(context); final colorScheme = ColorScheme.of(context);
final isDark = theme.brightness.isDark; final isDark = colorScheme.isDark;
if (isDark != isDarkMode) { if (isDark != isDarkMode) {
isDarkMode = isDark; isDarkMode = isDark;
renderer = TextSpanRenderer( renderer = TextSpanRenderer(
const TextStyle(), null,
isDark ? githubDarkTheme : githubTheme, isDark ? githubDarkTheme : githubTheme,
); );
result.render(renderer); result.render(renderer);
@@ -87,12 +87,7 @@ Future<void> importFromClipBoard<T>(
actions: [ actions: [
TextButton( TextButton(
onPressed: Get.back, onPressed: Get.back,
child: Text( child: Text('取消', style: TextStyle(color: colorScheme.outline)),
'取消',
style: TextStyle(
color: theme.colorScheme.outline,
),
),
), ),
TextButton( TextButton(
onPressed: () => Get.back(result: true), onPressed: () => Get.back(result: true),

View File

@@ -12,6 +12,7 @@ import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/video_utils.dart'; import 'package:PiliPlus/utils/video_utils.dart';
import 'package:collection/collection.dart';
abstract final class DownloadHttp { abstract final class DownloadHttp {
static const String referer = "https://www.bilibili.com/"; static const String referer = "https://www.bilibili.com/";

View File

@@ -18,7 +18,6 @@ import 'package:PiliPlus/utils/cache_manager.dart';
import 'package:PiliPlus/utils/calc_window_position.dart'; import 'package:PiliPlus/utils/calc_window_position.dart';
import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/device_utils.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:PiliPlus/utils/json_file_handler.dart'; import 'package:PiliPlus/utils/json_file_handler.dart';
import 'package:PiliPlus/utils/max_screen_size.dart'; import 'package:PiliPlus/utils/max_screen_size.dart';
@@ -31,6 +30,7 @@ import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/theme_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:catcher_2/catcher_2.dart'; import 'package:catcher_2/catcher_2.dart';
import 'package:collection/collection.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@@ -192,9 +192,13 @@ void main() async {
if (Pref.enableLog) { if (Pref.enableLog) {
// 异常捕获 logo记录 // 异常捕获 logo记录
final customParameters = { final customParameters = {
'BuildConfig': 'Build Time': DateFormatUtils.format(
'\nBuild Time: ${DateFormatUtils.format(BuildConfig.buildTime, format: DateFormatUtils.longFormatDs)}\n' BuildConfig.buildTime,
'Commit Hash: ${BuildConfig.commitHash}', format: DateFormatUtils.longFormatDs,
),
'Commit Hash': BuildConfig.commitHash,
'MPV Api Version':
'${NativePlayer.apiVersion >> 16}.${NativePlayer.apiVersion & 0xFFFF}',
}; };
final fileHandler = await JsonFileHandler.init(); final fileHandler = await JsonFileHandler.init();
final Catcher2Options debugConfig = Catcher2Options( final Catcher2Options debugConfig = Catcher2Options(

View File

@@ -58,7 +58,7 @@ class BiliDownloadEntryInfo with MultiSelectData {
return title; return title;
} }
Widget moreBtn(ThemeData theme) => SizedBox( Widget moreBtn(ColorScheme colorScheme) => SizedBox(
width: 29, width: 29,
height: 29, height: 29,
child: PopupMenuButton( child: PopupMenuButton(
@@ -66,7 +66,7 @@ class BiliDownloadEntryInfo with MultiSelectData {
position: PopupMenuPosition.under, position: PopupMenuPosition.under,
icon: Icon( icon: Icon(
Icons.more_vert_outlined, Icons.more_vert_outlined,
color: theme.colorScheme.outline, color: colorScheme.outline,
size: 18, size: 18,
), ),
itemBuilder: (_) => [ itemBuilder: (_) => [

View File

@@ -633,7 +633,7 @@ class OpusContent extends StatelessWidget {
); );
case 7 when (element.code != null): case 7 when (element.code != null):
final renderer = TextSpanRenderer( final renderer = TextSpanRenderer(
const TextStyle(), null,
isDarkMode ? githubDarkTheme : githubTheme, isDarkMode ? githubDarkTheme : githubTheme,
); );
highlight highlight

View File

@@ -12,13 +12,13 @@ import 'package:PiliPlus/models_new/video/video_tag/data.dart';
import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/controller.dart';
import 'package:PiliPlus/pages/video/introduction/ugc/widgets/triple_mixin.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/triple_mixin.dart';
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';

View File

@@ -5,8 +5,8 @@ import 'package:PiliPlus/models_new/download/download_info.dart';
import 'package:PiliPlus/pages/common/multi_select/base.dart' import 'package:PiliPlus/pages/common/multi_select/base.dart'
show BaseMultiSelectMixin; show BaseMultiSelectMixin;
import 'package:PiliPlus/services/download/download_service.dart'; import 'package:PiliPlus/services/download/download_service.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart' show Text; import 'package:flutter/widgets.dart' show Text;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';

View File

@@ -11,9 +11,9 @@ import 'package:PiliPlus/pages/common/multi_select/base.dart'
import 'package:PiliPlus/pages/download/controller.dart'; import 'package:PiliPlus/pages/download/controller.dart';
import 'package:PiliPlus/pages/download/detail/widgets/item.dart'; import 'package:PiliPlus/pages/download/detail/widgets/item.dart';
import 'package:PiliPlus/services/download/download_service.dart'; import 'package:PiliPlus/services/download/download_service.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart' import 'package:flutter/material.dart'
hide SliverGridDelegateWithMaxCrossAxisExtent; hide SliverGridDelegateWithMaxCrossAxisExtent;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';

View File

@@ -346,7 +346,7 @@ class DetailItem extends StatelessWidget {
Positioned( Positioned(
right: 0, right: 0,
bottom: 0, bottom: 0,
child: entry.moreBtn(theme), child: entry.moreBtn(theme.colorScheme),
), ),
] else ] else
Positioned( Positioned(

View File

@@ -17,10 +17,10 @@ import 'package:PiliPlus/pages/download/detail/widgets/item.dart';
import 'package:PiliPlus/pages/download/search/view.dart'; import 'package:PiliPlus/pages/download/search/view.dart';
import 'package:PiliPlus/services/download/download_service.dart'; import 'package:PiliPlus/services/download/download_service.dart';
import 'package:PiliPlus/utils/cache_manager.dart'; import 'package:PiliPlus/utils/cache_manager.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart' show IterableExt;
import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart' import 'package:flutter/material.dart'
hide SliverGridDelegateWithMaxCrossAxisExtent, LayoutBuilder; hide SliverGridDelegateWithMaxCrossAxisExtent, LayoutBuilder;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -385,7 +385,7 @@ class _DownloadPageState extends State<DownloadPage> {
color: theme.colorScheme.outline, color: theme.colorScheme.outline,
), ),
), ),
pageInfo.entries.first.moreBtn(theme), pageInfo.entries.first.moreBtn(theme.colorScheme),
], ],
), ),
], ],

View File

@@ -13,11 +13,11 @@ import 'package:PiliPlus/models/dynamics/vote_model.dart';
import 'package:PiliPlus/models_new/followee_votes/vote.dart'; import 'package:PiliPlus/models_new/followee_votes/vote.dart';
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/num_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart' hide LayoutBuilder; import 'package:flutter/material.dart' hide LayoutBuilder;
import 'package:get/get.dart'; import 'package:get/get.dart';

View File

@@ -28,9 +28,9 @@ import 'package:PiliPlus/pages/emote/view.dart';
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart' hide showTimePicker; import 'package:flutter/material.dart' hide showTimePicker;
import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter; import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -654,10 +654,10 @@ class _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {
Widget get voteBtn => ToolbarIconButton( Widget get voteBtn => ToolbarIconButton(
onPressed: () async { onPressed: () async {
controller.keepChatPanel(); controller.keepChatPanel();
RichTextItem? voteItem = editController.items.firstWhereOrNull( final voteItem = editController.items.firstWhereOrNull(
(e) => e.type == RichTextType.vote, (e) => e.type == RichTextType.vote,
); );
final VoteInfo? voteInfo = await Navigator.of(context).push( final voteInfo = await Navigator.of(context).push<VoteInfo>(
GetPageRoute( GetPageRoute(
page: () => CreateVotePage( page: () => CreateVotePage(
voteId: voteItem?.id == null ? null : int.parse(voteItem!.id!), voteId: voteItem?.id == null ? null : int.parse(voteItem!.id!),

View File

@@ -5,7 +5,7 @@ import 'package:PiliPlus/models_new/space/space_opus/data.dart';
import 'package:PiliPlus/models_new/space/space_opus/item.dart'; import 'package:PiliPlus/models_new/space/space_opus/item.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart';
import 'package:PiliPlus/pages/member/controller.dart'; import 'package:PiliPlus/pages/member/controller.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:collection/collection.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
class MemberOpusController class MemberOpusController

View File

@@ -480,14 +480,14 @@ class _EditProfilePageState extends State<EditProfilePage> {
imageQuality: 100, imageQuality: 100,
); );
if (pickedFile != null && mounted) { if (pickedFile != null && mounted) {
String? mimeType = lookupMimeType( String? imagePath = pickedFile.path;
pickedFile.path, String? mimeType = (pickedFile.mimeType ?? lookupMimeType(imagePath))
)?.split('/').elementAtOrNull(1); ?.split('/')
.elementAtOrNull(1);
if (mimeType == 'gif') { if (mimeType == 'gif') {
SmartDialog.showToast('不能选GIF'); SmartDialog.showToast('不能选GIF');
return; return;
} }
String? imagePath = pickedFile.path;
if (PlatformUtils.isMobile) { if (PlatformUtils.isMobile) {
final croppedFile = await ImageCropper.platform.cropImage( final croppedFile = await ImageCropper.platform.cropImage(
sourcePath: imagePath, sourcePath: imagePath,

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_key.dart';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show PlatformException; import 'package:flutter/services.dart' show PlatformException;

View File

@@ -53,7 +53,7 @@ class _LogsPageState extends State<LogsPage> {
logsContent = (await logsPath.readAsLines()).reversed.map((i) { logsContent = (await logsPath.readAsLines()).reversed.map((i) {
try { try {
final log = Report.fromJson(jsonDecode(i)); final log = Report.fromJson(jsonDecode(i));
latestLog ??= log.copyWith(); latestLog ??= log;
return log; return log;
} catch (e, s) { } catch (e, s) {
return Report( return Report(
@@ -464,30 +464,7 @@ class Report extends catcher.Report {
null, null,
); );
Report copyWith({ static String _params2String(Map<String, dynamic> params) {
dynamic error,
dynamic stackTrace,
DateTime? dateTime,
Map<String, dynamic>? deviceParameters,
Map<String, dynamic>? applicationParameters,
Map<String, dynamic>? customParameters,
FlutterErrorDetails? errorDetails,
PlatformType? platformType,
}) {
return Report(
error ?? this.error,
stackTrace ?? this.stackTrace,
dateTime ?? this.dateTime,
deviceParameters ?? this.deviceParameters,
applicationParameters ?? this.applicationParameters,
customParameters ?? this.customParameters,
errorDetails ?? this.errorDetails,
platformType ?? this.platformType,
null,
);
}
String _params2String(Map<String, dynamic> params) {
return params.entries return params.entries
.map((entry) => '${entry.key}: ${entry.value}\n') .map((entry) => '${entry.key}: ${entry.value}\n')
.join(); .join();

View File

@@ -66,6 +66,7 @@ import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/theme_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:PiliPlus/utils/video_utils.dart'; import 'package:PiliPlus/utils/video_utils.dart';
import 'package:collection/collection.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@@ -185,7 +185,7 @@ class _LocalIntroPanelState extends State<LocalIntroPanel>
), ),
Align( Align(
alignment: Alignment.bottomRight, alignment: Alignment.bottomRight,
child: entry.moreBtn(theme), child: entry.moreBtn(theme.colorScheme),
), ),
], ],
), ),

View File

@@ -20,7 +20,6 @@ import 'package:PiliPlus/pages/video/pay_coins/view.dart';
import 'package:PiliPlus/pages/video/reply/controller.dart'; import 'package:PiliPlus/pages/video/reply/controller.dart';
import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';
import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/services/service_locator.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/id_utils.dart';
@@ -28,6 +27,7 @@ import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/share_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -181,8 +181,14 @@ class PgcIntroController extends CommonIntroController {
style: TextStyle(fontSize: 14), style: TextStyle(fontSize: 14),
), ),
onTap: () { onTap: () {
final item = pgcItem.episodes?.firstWhereOrNull(
(item) => item.epId == epId,
);
Get.back(); Get.back();
ShareUtils.shareText(videoUrl); ShareUtils.shareText(
'${pgcItem.title}${item != null ? ' ${item.showTitle}' : ''}'
' - $videoUrl',
);
}, },
), ),
ListTile( ListTile(
@@ -193,7 +199,7 @@ class PgcIntroController extends CommonIntroController {
), ),
onTap: () { onTap: () {
Get.back(); Get.back();
EpisodeItem? item = pgcItem.episodes?.firstWhereOrNull( final item = pgcItem.episodes?.firstWhereOrNull(
(item) => item.epId == epId, (item) => item.epId == epId,
); );
showModalBottomSheet( showModalBottomSheet(

View File

@@ -9,7 +9,6 @@ import 'package:PiliPlus/common/widgets/image_viewer/hero.dart';
import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart';
import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/models/common/image_preview_type.dart';
import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models/common/image_type.dart';
import 'package:PiliPlus/models/common/stat_type.dart';
import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';
import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/controller.dart';
import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart'; import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';
@@ -60,7 +59,7 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context); final colorScheme = ColorScheme.of(context);
final item = introController.pgcItem; final item = introController.pgcItem;
final isLandscape = widget.isLandscape; final isLandscape = widget.isLandscape;
Widget sliver = SliverToBoxAdapter( Widget sliver = SliverToBoxAdapter(
@@ -71,13 +70,13 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
spacing: 10, spacing: 10,
children: [ children: [
_buildCover(theme, isLandscape, item), _buildCover(colorScheme, isLandscape, item),
Expanded(child: _buildInfoPanel(isLandscape, theme, item)), Expanded(child: _buildInfoPanel(isLandscape, colorScheme, item)),
], ],
), ),
const SizedBox(height: 6), const SizedBox(height: 6),
// 点赞收藏转发 布局样式2 // 点赞收藏转发 布局样式2
if (introController.isPgc) actionGrid(theme, item, introController), if (introController.isPgc) actionGrid(item, introController),
// 番剧分集 // 番剧分集
if (item.episodes?.isNotEmpty == true) if (item.episodes?.isNotEmpty == true)
PgcPanel( PgcPanel(
@@ -94,18 +93,16 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
if (!introController.isPgc) { if (!introController.isPgc) {
final brief = _buildBrief(item); final brief = _buildBrief(item);
if (brief != null) { if (brief != null) {
sliver = SliverMainAxisGroup( sliver = SliverMainAxisGroup(slivers: [sliver, brief]);
slivers: [
sliver,
brief,
],
);
} }
} }
return SliverPadding( return SliverPadding(
padding: padding: const .fromLTRB(
const EdgeInsets.all(Style.safeSpace) + Style.safeSpace,
const EdgeInsets.only(bottom: 50), Style.safeSpace,
Style.safeSpace,
Style.safeSpace + 50,
),
sliver: sliver, sliver: sliver,
); );
} }
@@ -118,11 +115,7 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
final imgWidth = maxWidth - padding; final imgWidth = maxWidth - padding;
padding = padding / 2; padding = padding / 2;
return SliverPadding( return SliverPadding(
padding: EdgeInsetsGeometry.only( padding: .only(top: 10, left: padding, right: padding),
top: 10,
left: padding,
right: padding,
),
sliver: SliverMainAxisGroup( sliver: SliverMainAxisGroup(
slivers: img.map((e) { slivers: img.map((e) {
return SliverToBoxAdapter( return SliverToBoxAdapter(
@@ -140,7 +133,11 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
return null; return null;
} }
Widget _buildCover(ThemeData theme, bool isLandscape, PgcInfoModel item) { Widget _buildCover(
ColorScheme colorScheme,
bool isLandscape,
PgcInfoModel item,
) {
return Stack( return Stack(
clipBehavior: Clip.none, clipBehavior: Clip.none,
children: [ children: [
@@ -180,11 +177,11 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
? const Icon(Icons.star_rounded) ? const Icon(Icons.star_rounded)
: const Icon(Icons.star_border_rounded), : const Icon(Icons.star_border_rounded),
bgColor: isFav bgColor: isFav
? theme.colorScheme.secondaryContainer ? colorScheme.secondaryContainer
: theme.colorScheme.onInverseSurface, : colorScheme.onInverseSurface,
iconColor: isFav iconColor: isFav
? theme.colorScheme.onSecondaryContainer ? colorScheme.onSecondaryContainer
: theme.colorScheme.onSurfaceVariant, : colorScheme.onSurfaceVariant,
); );
}), }),
), ),
@@ -192,7 +189,11 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
); );
} }
Widget _buildInfoPanel(bool isLandscape, ThemeData theme, PgcInfoModel item) { Widget _buildInfoPanel(
bool isLandscape,
ColorScheme colorScheme,
PgcInfoModel item,
) {
if (introController.isPgc) { if (introController.isPgc) {
Widget subBtn() => Obx( Widget subBtn() => Obx(
() { () {
@@ -206,10 +207,8 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
vertical: 10, vertical: 10,
), ),
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
foregroundColor: isFollowed ? theme.colorScheme.outline : null, foregroundColor: isFollowed ? colorScheme.outline : null,
backgroundColor: isFollowed backgroundColor: isFollowed ? colorScheme.onInverseSurface : null,
? theme.colorScheme.onInverseSurface
: null,
), ),
onPressed: followStatus == -1 onPressed: followStatus == -1
? null ? null
@@ -259,10 +258,7 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
List<Widget> desc() => [ List<Widget> desc() => [
Text( Text(
item.newEp!.desc!, item.newEp!.desc!,
style: TextStyle( style: TextStyle(fontSize: 12, color: colorScheme.outline),
fontSize: 12,
color: theme.colorScheme.outline,
),
), ),
Text.rich( Text.rich(
TextSpan( TextSpan(
@@ -274,24 +270,15 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
), ),
], ],
), ),
style: TextStyle( style: TextStyle(fontSize: 12, color: colorScheme.outline),
fontSize: 12,
color: theme.colorScheme.outline,
),
), ),
]; ];
Widget stat() => Wrap( Widget stat() => Wrap(
spacing: 6, spacing: 6,
runSpacing: 2, runSpacing: 2,
children: [ children: [
StatWidget( StatWidget(type: .play, value: item.stat!.view),
type: StatType.play, StatWidget(type: .danmaku, value: item.stat!.danmaku),
value: item.stat!.view,
),
StatWidget(
type: StatType.danmaku,
value: item.stat!.danmaku,
),
if (isLandscape) ...desc(), if (isLandscape) ...desc(),
], ],
); );
@@ -314,10 +301,7 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
Expanded( Expanded(
child: Text( child: Text(
'简介:${item.evaluate}', '简介:${item.evaluate}',
style: TextStyle( style: TextStyle(fontSize: 13, color: colorScheme.outline),
fontSize: 13,
color: theme.colorScheme.outline,
),
), ),
), ),
], ],
@@ -351,7 +335,7 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
role, role,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: theme.colorScheme.outline, color: colorScheme.outline,
), ),
), ),
], ],
@@ -391,7 +375,7 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
item.subtitle!, item.subtitle!,
style: TextStyle( style: TextStyle(
fontSize: 13, fontSize: 13,
color: theme.colorScheme.onSurfaceVariant, color: colorScheme.onSurfaceVariant,
), ),
), ),
], ],
@@ -400,7 +384,6 @@ class _PgcIntroPageState extends State<PgcIntroPage> {
} }
Widget actionGrid( Widget actionGrid(
ThemeData theme,
PgcInfoModel item, PgcInfoModel item,
PgcIntroController introController, PgcIntroController introController,
) { ) {

View File

@@ -41,7 +41,6 @@ import 'package:PiliPlus/services/shutdown_timer_service.dart'
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/accounts/account.dart';
import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/connectivity_utils.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart';
import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart';
@@ -55,6 +54,7 @@ import 'package:PiliPlus/utils/utils.dart';
import 'package:PiliPlus/utils/video_utils.dart'; import 'package:PiliPlus/utils/video_utils.dart';
import 'package:battery_plus/battery_plus.dart'; import 'package:battery_plus/battery_plus.dart';
import 'package:canvas_danmaku/canvas_danmaku.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart';
import 'package:collection/collection.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:easy_debounce/easy_throttle.dart'; import 'package:easy_debounce/easy_throttle.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';

View File

@@ -25,8 +25,8 @@ class ImSettingsItem extends StatelessWidget {
} }
const titleStyle = TextStyle(fontSize: 14); const titleStyle = TextStyle(fontSize: 14);
final theme = Theme.of(context); final colorScheme = ColorScheme.of(context);
final outline = theme.colorScheme.outline; final outline = colorScheme.outline;
final subtitleStyle = TextStyle(fontSize: 13, color: outline); final subtitleStyle = TextStyle(fontSize: 13, color: outline);
if (item.hasSwitch_1()) { if (item.hasSwitch_1()) {
@@ -156,11 +156,7 @@ class ImSettingsItem extends StatelessWidget {
}, },
title: Text(e.text, style: titleStyle), title: Text(e.text, style: titleStyle),
trailing: e.selected trailing: e.selected
? Icon( ? Icon(size: 20, Icons.check, color: colorScheme.primary)
size: 20,
Icons.check,
color: theme.colorScheme.primary,
)
: null, : null,
); );
}, },

View File

@@ -9,11 +9,11 @@ import 'package:PiliPlus/models_new/video/video_detail/data.dart';
import 'package:PiliPlus/models_new/video/video_detail/page.dart'; import 'package:PiliPlus/models_new/video/video_detail/page.dart';
import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart';
import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_status.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/path_utils.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
import 'package:collection/collection.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
Future<VideoPlayerServiceHandler> initAudioService() { Future<VideoPlayerServiceHandler> initAudioService() {

View File

@@ -31,47 +31,8 @@ abstract final class Accounts {
return deletedEntries > 2; return deletedEntries > 2;
}, },
); );
// await _migrate();
} }
// static Future<void> _migrate() async {
// final Directory tempDir = await getApplicationSupportDirectory();
// final String tempPath = "${tempDir.path}/.plpl/";
// final Directory dir = Directory(tempPath);
// if (dir.existsSync()) {
// if (kDebugMode) debugPrint('migrating...');
// final cookieJar = PersistCookieJar(
// ignoreExpires: true,
// storage: FileStorage(tempPath),
// );
// await cookieJar.forceInit();
// final cookies = DefaultCookieJar(ignoreExpires: true)
// ..domainCookies.addAll(cookieJar.domainCookies);
// final localAccessKey = GStorage.localCache.get(
// 'accessKey',
// defaultValue: {},
// );
// final isLogin =
// cookies.domainCookies['bilibili.com']?['/']?['SESSDATA'] != null;
// await Future.wait([
// GStorage.localCache.delete('accessKey'),
// GStorage.localCache.delete('danmakuFilterRule'),
// GStorage.localCache.delete('blackMidsList'),
// dir.delete(recursive: true),
// if (isLogin)
// LoginAccount(
// cookies,
// localAccessKey['value'],
// localAccessKey['refresh'],
// AccountType.values.toSet(),
// ).onChange(),
// ]);
// if (kDebugMode) debugPrint('migrated successfully');
// }
// }
static Future<void> refresh() { static Future<void> refresh() {
for (final a in account.values) { for (final a in account.values) {
for (final t in a.type) { for (final t in a.type) {

View File

@@ -1,5 +1,5 @@
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:collection/collection.dart';
import 'package:flutter/rendering.dart' show Offset, Size; import 'package:flutter/rendering.dart' show Offset, Size;
import 'package:screen_retriever/screen_retriever.dart'; import 'package:screen_retriever/screen_retriever.dart';

View File

@@ -1,11 +1,8 @@
import 'dart:io' show FileSystemEntity, Directory; import 'dart:io' show FileSystemEntity, Directory;
extension FileSystemEntityExt on FileSystemEntity { extension FileSystemEntityExt on FileSystemEntity {
Future<void> tryDel({bool recursive = false}) async { Future<void> tryDel({bool recursive = false}) =>
try { delete(recursive: recursive).catchError((_) => this);
await delete(recursive: recursive);
} catch (_) {}
}
} }
extension DirectoryExt on Directory { extension DirectoryExt on Directory {

View File

@@ -14,13 +14,6 @@ extension IterableExt<T> on Iterable<T> {
} }
return value; return value;
} }
T? firstWhereOrNull(bool Function(T element) test) {
for (final element in this) {
if (test(element)) return element;
}
return null;
}
} }
extension ListExt<T> on List<T> { extension ListExt<T> on List<T> {
@@ -69,6 +62,6 @@ extension ListExt<T> on List<T> {
T? getOrNull(int index) { T? getOrNull(int index) {
if (index < 0 || index >= length) return null; if (index < 0 || index >= length) return null;
return elementAt(index); return this[index];
} }
} }

View File

@@ -20,7 +20,6 @@ import 'package:PiliPlus/pages/share/view.dart';
import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/app_scheme.dart';
import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart';
import 'package:PiliPlus/utils/extension/extension.dart'; import 'package:PiliPlus/utils/extension/extension.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart';
import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart';
import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/feed_back.dart';
@@ -30,6 +29,7 @@ import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/url_utils.dart'; import 'package:PiliPlus/utils/url_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:collection/collection.dart';
import 'package:floating/floating.dart'; import 'package:floating/floating.dart';
import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@@ -45,7 +45,7 @@ abstract final class Update {
SmartDialog.show( SmartDialog.show(
animationType: SmartAnimationType.centerFade_otherSlide, animationType: SmartAnimationType.centerFade_otherSlide,
builder: (context) { builder: (context) {
final ThemeData theme = Theme.of(context); final colorScheme = ColorScheme.of(context);
Widget downloadBtn(String text, {String? ext}) => TextButton( Widget downloadBtn(String text, {String? ext}) => TextButton(
onPressed: () => onDownload(data, ext: ext), onPressed: () => onDownload(data, ext: ext),
child: Text(text), child: Text(text),
@@ -70,9 +70,7 @@ abstract final class Update {
), ),
child: Text( child: Text(
"点此查看完整更新(即commit)内容", "点此查看完整更新(即commit)内容",
style: TextStyle( style: TextStyle(color: colorScheme.primary),
color: theme.colorScheme.primary,
),
), ),
), ),
], ],
@@ -88,18 +86,14 @@ abstract final class Update {
}, },
child: Text( child: Text(
'不再提醒', '不再提醒',
style: TextStyle( style: TextStyle(color: colorScheme.outline),
color: theme.colorScheme.outline,
),
), ),
), ),
TextButton( TextButton(
onPressed: SmartDialog.dismiss, onPressed: SmartDialog.dismiss,
child: Text( child: Text(
'取消', '取消',
style: TextStyle( style: TextStyle(color: colorScheme.outline),
color: theme.colorScheme.outline,
),
), ),
), ),
if (Platform.isWindows) ...[ if (Platform.isWindows) ...[