diff --git a/analysis_options.yaml b/analysis_options.yaml index 2e03c015e..0a3be5cca 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -61,5 +61,7 @@ linter: - use_decorated_box - use_named_constants - use_null_aware_elements + - unnecessary_lambdas + - use_is_even_rather_than_modulo # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/lib/common/skeleton/video_card_h.dart b/lib/common/skeleton/video_card_h.dart index 7210ef4c0..b25a6a9dd 100644 --- a/lib/common/skeleton/video_card_h.dart +++ b/lib/common/skeleton/video_card_h.dart @@ -19,15 +19,11 @@ class VideoCardHSkeleton extends StatelessWidget { children: [ AspectRatio( aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder( - builder: (context, boxConstraints) { - return DecoratedBox( - decoration: BoxDecoration( - color: color, - borderRadius: StyleString.mdRadius, - ), - ); - }, + child: DecoratedBox( + decoration: BoxDecoration( + color: color, + borderRadius: StyleString.mdRadius, + ), ), ), Expanded( diff --git a/lib/common/skeleton/video_card_v.dart b/lib/common/skeleton/video_card_v.dart index 265ba58c8..f8f9a2cb5 100644 --- a/lib/common/skeleton/video_card_v.dart +++ b/lib/common/skeleton/video_card_v.dart @@ -13,15 +13,11 @@ class VideoCardVSkeleton extends StatelessWidget { children: [ AspectRatio( aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder( - builder: (context, boxConstraints) { - return DecoratedBox( - decoration: BoxDecoration( - color: color, - borderRadius: StyleString.mdRadius, - ), - ); - }, + child: DecoratedBox( + decoration: BoxDecoration( + color: color, + borderRadius: StyleString.mdRadius, + ), ), ), Padding( diff --git a/lib/common/widgets/dyn/ink_well.dart b/lib/common/widgets/dyn/ink_well.dart index 14c197be5..110f5f762 100644 --- a/lib/common/widgets/dyn/ink_well.dart +++ b/lib/common/widgets/dyn/ink_well.dart @@ -980,9 +980,7 @@ class _InkResponseState extends State<_InkResponseStateWidget> if (!mounted) { return; } - setState(() { - updateFocusHighlights(); - }); + setState(updateFocusHighlights); } bool get _shouldShowFocus => diff --git a/lib/common/widgets/image/network_img_layer.dart b/lib/common/widgets/image/network_img_layer.dart index 2213ff3ad..878ab396a 100644 --- a/lib/common/widgets/image/network_img_layer.dart +++ b/lib/common/widgets/image/network_img_layer.dart @@ -47,24 +47,32 @@ class NetworkImgLayer extends StatelessWidget { @override Widget build(BuildContext context) { final noRadius = type == ImageType.emote || radius == 0; + final Widget child; if (src?.isNotEmpty == true) { - Widget child = _buildImage(context, noRadius); - if (noRadius) { - return child; - } - if (type == ImageType.avatar) { - return ClipOval(child: child); - } - return ClipRRect( - borderRadius: radius != null - ? BorderRadius.circular(radius!) - : StyleString.mdRadius, - child: child, - ); + child = noRadius + ? _buildImage(context, noRadius) + : type == ImageType.avatar + ? ClipOval(child: _buildImage(context, noRadius)) + : ClipRRect( + borderRadius: radius != null + ? BorderRadius.circular(radius!) + : StyleString.mdRadius, + child: _buildImage(context, noRadius), + ); + } else { + child = getPlaceHolder?.call() ?? _placeholder(context, noRadius); } - return getPlaceHolder?.call() ?? _placeholder(context, noRadius); + return semanticsLabel?.isNotEmpty == true + ? Semantics( + container: true, + image: true, + excludeSemantics: true, + label: semanticsLabel, + child: child, + ) + : child; } Widget _buildImage(BuildContext context, bool noRadius) { diff --git a/lib/common/widgets/page/tabs.dart b/lib/common/widgets/page/tabs.dart index cd567232d..c16e02457 100644 --- a/lib/common/widgets/page/tabs.dart +++ b/lib/common/widgets/page/tabs.dart @@ -244,9 +244,7 @@ class _CustomTabBarViewState extends State { ); } if (mounted) { - setState(() { - _updateChildren(); - }); + setState(_updateChildren); } return Future.value(); } @@ -286,9 +284,7 @@ class _CustomTabBarViewState extends State { } if (mounted) { - setState(() { - _updateChildren(); - }); + setState(_updateChildren); } } diff --git a/lib/common/widgets/stat/stat.dart b/lib/common/widgets/stat/stat.dart index 53780027f..b87606fd3 100644 --- a/lib/common/widgets/stat/stat.dart +++ b/lib/common/widgets/stat/stat.dart @@ -27,6 +27,7 @@ class StatWidget extends StatelessWidget { children: [ Icon( type.iconData, + semanticLabel: type.label, size: iconSize, color: color, ), diff --git a/lib/common/widgets/tabs.dart b/lib/common/widgets/tabs.dart index 7d5b9deb5..cf3807362 100644 --- a/lib/common/widgets/tabs.dart +++ b/lib/common/widgets/tabs.dart @@ -238,9 +238,7 @@ class _CustomTabBarViewState extends State { ); } if (mounted) { - setState(() { - _updateChildren(); - }); + setState(_updateChildren); } return Future.value(); } @@ -280,9 +278,7 @@ class _CustomTabBarViewState extends State { } if (mounted) { - setState(() { - _updateChildren(); - }); + setState(_updateChildren); } } diff --git a/lib/common/widgets/video_card/video_card_v.dart b/lib/common/widgets/video_card/video_card_v.dart index 843703df8..76a085fa3 100644 --- a/lib/common/widgets/video_card/video_card_v.dart +++ b/lib/common/widgets/video_card/video_card_v.dart @@ -190,6 +190,7 @@ class VideoCardV extends StatelessWidget { videoItem.owner.name.toString(), maxLines: 1, overflow: TextOverflow.clip, + semanticsLabel: 'UP:${videoItem.owner.name}', style: TextStyle( height: 1.5, fontSize: theme.textTheme.labelMedium!.fontSize, @@ -234,8 +235,8 @@ class VideoCardV extends StatelessWidget { ), text: DateUtil.dateFormat( videoItem.pubdate, - shortFormat: shortFormat, - longFormat: longFormat, + short: shortFormat, + long: longFormat, ), ), ), diff --git a/lib/grpc/reply.dart b/lib/grpc/reply.dart index 48c2e96d4..9bafc6e24 100644 --- a/lib/grpc/reply.dart +++ b/lib/grpc/reply.dart @@ -73,7 +73,7 @@ class ReplyGrpc { mainListReply.replies.removeWhere((item) { final hasMatch = needRemoveGrpc(item); if (!hasMatch && item.replies.isNotEmpty) { - item.replies.removeWhere((i) => needRemoveGrpc(i)); + item.replies.removeWhere(needRemoveGrpc); } return hasMatch; }); @@ -104,7 +104,7 @@ class ReplyGrpc { DetailListReply.fromBuffer, ); return res - ..dataOrNull?.root.replies.removeWhere((item) => needRemoveGrpc(item)); + ..dataOrNull?.root.replies.removeWhere(needRemoveGrpc); } static Future> dialogList({ @@ -125,7 +125,7 @@ class ReplyGrpc { ), DialogListReply.fromBuffer, ); - return res..dataOrNull?.replies.removeWhere((item) => needRemoveGrpc(item)); + return res..dataOrNull?.replies.removeWhere(needRemoveGrpc); } static Future> searchItem({ diff --git a/lib/http/user.dart b/lib/http/user.dart index 002375470..9fcd49ede 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -301,18 +301,22 @@ class UserHttp { } } - static Future> videoTags({required String bvid}) async { + static Future?>> videoTags({ + required String bvid, + Object? cid, + }) async { var res = await Request().get( Api.videoTags, - queryParameters: {'bvid': bvid}, + queryParameters: {'bvid': bvid, 'cid': ?cid}, ); if (res.data['code'] == 0) { - List? list = (res.data['data'] as List?) - ?.map((e) => VideoTagItem.fromJson(e)) - .toList(); - return {'status': true, 'data': list}; + return Success( + (res.data['data'] as List?) + ?.map((e) => VideoTagItem.fromJson(e)) + .toList(), + ); } else { - return {'status': false}; + return const Error(null); } } diff --git a/lib/main.dart b/lib/main.dart index 1c34de2e3..8786c77dc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/models/common/theme/theme_color_type.dart'; import 'package:PiliPlus/router/app_pages.dart'; import 'package:PiliPlus/services/account_service.dart'; -import 'package:PiliPlus/services/loggeer.dart'; +import 'package:PiliPlus/services/logger.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/cache_manage.dart'; @@ -81,7 +81,7 @@ Commit Hash: ${BuildConfig.commitHash}'''; final Catcher2Options debugConfig = Catcher2Options( SilentReportMode(), [ - FileHandler(await getLogsPath()), + FileHandler(await LoggerUtils.getLogsPath()), ConsoleHandler( enableDeviceParameters: false, enableApplicationParameters: false, @@ -96,7 +96,7 @@ Commit Hash: ${BuildConfig.commitHash}'''; final Catcher2Options releaseConfig = Catcher2Options( SilentReportMode(), [ - FileHandler(await getLogsPath()), + FileHandler(await LoggerUtils.getLogsPath()), ConsoleHandler( enableCustomParameters: true, ), diff --git a/lib/models/common/stat_type.dart b/lib/models/common/stat_type.dart index d43eaa886..228530f84 100644 --- a/lib/models/common/stat_type.dart +++ b/lib/models/common/stat_type.dart @@ -1,14 +1,15 @@ import 'package:flutter/material.dart' show IconData, Icons; enum StatType { - view(Icons.remove_red_eye_outlined), - danmaku(Icons.subtitles_outlined), - like(Icons.thumb_up_outlined), - reply(Icons.comment_outlined), - follow(Icons.favorite_border), - play(Icons.play_circle_outlined), - listen(Icons.headset_outlined); + view(Icons.remove_red_eye_outlined, '观看'), + danmaku(Icons.subtitles_outlined, '弹幕'), + like(Icons.thumb_up_outlined, '点赞'), + reply(Icons.comment_outlined, '评论'), + follow(Icons.favorite_border, '关注'), + play(Icons.play_circle_outlined, '播放'), + listen(Icons.headset_outlined, '播放'); final IconData iconData; - const StatType(this.iconData); + final String label; + const StatType(this.iconData, this.label); } diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 96dc89c03..c6a2afdd2 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -118,7 +118,7 @@ class DynamicItemModel { idStr = json['item']?['id_str']; // type = json['type']; // int if (json['item']?['modules'] case List list) { - modules = ItemModulesModel.fromOpusJson(list.cast()); + modules = ItemModulesModel.fromOpusJson(list); } else { modules = ItemModulesModel(); } @@ -181,8 +181,8 @@ class ItemModulesModel { : null; } - ItemModulesModel.fromOpusJson(List> json) { - for (var i in json) { + ItemModulesModel.fromOpusJson(List json) { + for (Map i in json) { switch (i['module_type']) { case 'MODULE_TYPE_TOP': moduleTop = i['module_top'] == null diff --git a/lib/models/dynamics/vote_model.dart b/lib/models/dynamics/vote_model.dart index fbff1fbaa..5e2373606 100644 --- a/lib/models/dynamics/vote_model.dart +++ b/lib/models/dynamics/vote_model.dart @@ -1,3 +1,5 @@ +import 'package:PiliPlus/utils/extension.dart'; + class SimpleVoteInfo { int? choiceCnt; int? defaultShare; @@ -73,7 +75,7 @@ class VoteInfo extends SimpleVoteInfo { title = json['title']; uid = json['vote_publisher']; ctime = json['ctime']; - myVotes = (json['my_votes'] as List?)?.cast(); // doVote + myVotes = (json['my_votes'] as List?)?.fromCast(); // doVote options = (json['options'] as List?)?.map((v) => Option.fromJson(v)).toList() ??