diff --git a/analysis_options.yaml b/analysis_options.yaml index 861749662..54694b68f 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -64,5 +64,13 @@ linter: - use_null_aware_elements - unnecessary_lambdas - use_is_even_rather_than_modulo + - unnecessary_async + - unnecessary_await_in_return + - unnecessary_getters_setters + - prefer_const_literals_to_create_immutables + - no_literal_bool_comparisons + - use_truncating_division + - use_string_buffers + - unnecessary_statements # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/lib/common/widgets/flutter/text_field/controller.dart b/lib/common/widgets/flutter/text_field/controller.dart index 34edad9c2..2f64c940c 100644 --- a/lib/common/widgets/flutter/text_field/controller.dart +++ b/lib/common/widgets/flutter/text_field/controller.dart @@ -704,7 +704,7 @@ class RichTextEditingController extends TextEditingController { } } - if (addIndex != null && toAdd != null && toAdd.isNotEmpty == true) { + if (addIndex != null && toAdd != null && toAdd.isNotEmpty) { items.insertAll(addIndex, toAdd); } if (toDel != null && toDel.isNotEmpty) { diff --git a/lib/grpc/dyn.dart b/lib/grpc/dyn.dart index 1b9cec22c..573d5764d 100644 --- a/lib/grpc/dyn.dart +++ b/lib/grpc/dyn.dart @@ -36,7 +36,7 @@ class DynGrpc { static Future> opusDetail({ OpusType? opusType, required int oid, - }) async { + }) { return GrpcReq.request( GrpcUrl.opusDetail, OpusDetailReq( diff --git a/lib/grpc/grpc_req.dart b/lib/grpc/grpc_req.dart index 6068e7ca5..3d0e79ba9 100644 --- a/lib/grpc/grpc_req.dart +++ b/lib/grpc/grpc_req.dart @@ -164,8 +164,9 @@ class GrpcReq { int? code; String msg = response.headers.value('Grpc-Status-Details-Bin') ?? ''; if (msg.isNotEmpty) { - while (msg.length % 4 != 0) { - msg += '='; + final padding = -msg.length & 3; + if (padding != 0) { + msg += '=' * padding; } final msgBytes = base64Decode(msg); try { diff --git a/lib/pages/fav/note/view.dart b/lib/pages/fav/note/view.dart index 2768b6669..f1834cac0 100644 --- a/lib/pages/fav/note/view.dart +++ b/lib/pages/fav/note/view.dart @@ -62,9 +62,9 @@ class _FavNotePageState extends State const TextStyle(fontSize: 14), labelColor: theme.colorScheme.onSecondaryContainer, unselectedLabelColor: theme.colorScheme.outline, - tabs: [ - const Tab(text: '未发布笔记'), - const Tab(text: '公开笔记'), + tabs: const [ + Tab(text: '未发布笔记'), + Tab(text: '公开笔记'), ], onTap: (index) { try { @@ -105,9 +105,9 @@ class _FavNotePageState extends State child: TabBarView( controller: _tabController, physics: const NeverScrollableScrollPhysics(), - children: [ - const FavNoteChildPage(isPublish: false), - const FavNoteChildPage(isPublish: true), + children: const [ + FavNoteChildPage(isPublish: false), + FavNoteChildPage(isPublish: true), ], ), ), diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index 9caf28246..513db61d0 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -216,7 +216,7 @@ class _LivePageState extends CommonPageState itemCount: newTags.length, ), ), - response != null && response.isNotEmpty == true + response != null && response.isNotEmpty ? SliverGrid.builder( gridDelegate: gridDelegate, itemBuilder: (context, index) { diff --git a/lib/pages/member_home/view.dart b/lib/pages/member_home/view.dart index 553a1477c..1c14c59aa 100644 --- a/lib/pages/member_home/view.dart +++ b/lib/pages/member_home/view.dart @@ -290,9 +290,7 @@ class _MemberHomeState extends State child: Padding( padding: const EdgeInsets.only(left: 10), child: Icon( - visible == true - ? Icons.visibility - : Icons.visibility_off, + visible ? Icons.visibility : Icons.visibility_off, size: 17, color: color, ), diff --git a/lib/pages/member_video/widgets/video_card_h_member_video.dart b/lib/pages/member_video/widgets/video_card_h_member_video.dart index 9dcc1c902..4e9376d3a 100644 --- a/lib/pages/member_video/widgets/video_card_h_member_video.dart +++ b/lib/pages/member_video/widgets/video_card_h_member_video.dart @@ -47,7 +47,7 @@ class VideoCardHMemberVideo extends StatelessWidget { onSecondaryTap: Utils.isMobile ? null : onLongPress, onTap: onTap ?? - () async { + () { final isPgc = videoItem.isPgc == true; final isPugv = videoItem.isPugv == true; if ((isPgc || isPugv) && videoItem.uri?.isNotEmpty == true) { diff --git a/lib/pages/popular_series/view.dart b/lib/pages/popular_series/view.dart index a335b2192..5ed9c7cf1 100644 --- a/lib/pages/popular_series/view.dart +++ b/lib/pages/popular_series/view.dart @@ -59,7 +59,7 @@ class _PopularSeriesPageState extends State with GridMixin { return gridSkeleton; case Success?>(:var response): Widget sliver; - if (response != null && response.isNotEmpty == true) { + if (response != null && response.isNotEmpty) { sliver = SliverGrid.builder( gridDelegate: gridDelegate, itemCount: response.length, diff --git a/lib/pages/setting/models/model.dart b/lib/pages/setting/models/model.dart index e9e4b320b..f29c89271 100644 --- a/lib/pages/setting/models/model.dart +++ b/lib/pages/setting/models/model.dart @@ -115,7 +115,7 @@ SettingsModel getBanwordModel({ ), TextButton( child: const Text('保存'), - onPressed: () async { + onPressed: () { Get.back(); setState(); onChanged(RegExp(banWord, caseSensitive: false)); diff --git a/lib/pages/setting/recommend_setting.dart b/lib/pages/setting/recommend_setting.dart index 7c9e28a2a..d77315fe3 100644 --- a/lib/pages/setting/recommend_setting.dart +++ b/lib/pages/setting/recommend_setting.dart @@ -21,9 +21,7 @@ class _RecommendSettingState extends State { final theme = Theme.of(context); return Scaffold( resizeToAvoidBottomInset: false, - appBar: widget.showAppBar == false - ? null - : AppBar(title: const Text('推荐流设置')), + appBar: widget.showAppBar ? AppBar(title: const Text('推荐流设置')) : null, body: ListView( padding: EdgeInsets.only( left: showAppBar ? padding.left : 0, diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 8b4571df2..a18e362ce 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -1719,7 +1719,7 @@ class VideoDetailController extends GetxController } // interactive video - if (isStein != true) { + if (!isStein) { graphVersion = null; } steinEdgeInfo = null; diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 605b986e1..e0c4b4003 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -581,7 +581,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { (e) => e.cid == (skipPart - ? videoDetail.isPageReversed == true + ? videoDetail.isPageReversed ? videoDetail.pages!.last.cid : videoDetail.pages!.first.cid : this.cid.value), @@ -663,7 +663,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { (e) => e.cid == (skipPart - ? videoDetail.isPageReversed == true + ? videoDetail.isPageReversed ? videoDetail.pages!.last.cid : videoDetail.pages!.first.cid : this.cid.value), diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index c990d4962..6a019318c 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -714,7 +714,7 @@ class ReplyItemGrpc extends StatelessWidget { spanChildren.add( WidgetSpan( child: NetworkImgLayer( - src: emote.hasGifUrl() == true ? emote.gifUrl : emote.url, + src: emote.hasGifUrl() ? emote.gifUrl : emote.url, type: ImageType.emote, width: size, height: size, diff --git a/lib/pages/video/reply_search_item/child/controller.dart b/lib/pages/video/reply_search_item/child/controller.dart index 241938346..d79ce021b 100644 --- a/lib/pages/video/reply_search_item/child/controller.dart +++ b/lib/pages/video/reply_search_item/child/controller.dart @@ -15,7 +15,7 @@ class ReplySearchChildController @override List? getDataList(SearchItemReply response) { - if (response.cursor.hasNext == false) { + if (!response.cursor.hasNext) { isEnd = true; } return response.items; diff --git a/lib/pages/video/reply_search_item/view.dart b/lib/pages/video/reply_search_item/view.dart index fd6933ad4..5e1aa30e5 100644 --- a/lib/pages/video/reply_search_item/view.dart +++ b/lib/pages/video/reply_search_item/view.dart @@ -63,9 +63,9 @@ class _ReplySearchPageState extends State { children: [ TabBar( controller: _controller.tabController, - tabs: [ - const Tab(text: '视频'), - const Tab(text: '专栏'), + tabs: const [ + Tab(text: '视频'), + Tab(text: '专栏'), ], onTap: (index) { if (!_controller.tabController.indexIsChanging) { diff --git a/lib/pages/webdav/webdav.dart b/lib/pages/webdav/webdav.dart index b8c83796d..e5d55ccf1 100644 --- a/lib/pages/webdav/webdav.dart +++ b/lib/pages/webdav/webdav.dart @@ -64,7 +64,7 @@ class WebDav { Future backup() async { if (_client == null) { final res = await init(); - if (res.first == false) { + if (!res.first) { SmartDialog.showToast('备份失败,请检查配置: ${res.second}'); return; } @@ -86,7 +86,7 @@ class WebDav { Future restore() async { if (_client == null) { final res = await init(); - if (res.first == false) { + if (!res.first) { SmartDialog.showToast('恢复失败,请检查配置: ${res.second}'); return; } diff --git a/lib/pages/whisper_secondary/controller.dart b/lib/pages/whisper_secondary/controller.dart index 2848acff1..6d95c2d77 100644 --- a/lib/pages/whisper_secondary/controller.dart +++ b/lib/pages/whisper_secondary/controller.dart @@ -31,7 +31,7 @@ class WhisperSecController @override List? getDataList(SessionSecondaryReply response) { - if (response.paginationParams.hasMore == false) { + if (!response.paginationParams.hasMore) { isEnd = true; } offset = response.paginationParams.offsets; diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index fb970c42b..22d9dad5e 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -229,9 +229,9 @@ class PlPlayerController { Offset initialFocalPoint = Offset.zero; - Future exitDesktopPip() async { + Future exitDesktopPip() { isDesktopPip = false; - await Future.wait([ + return Future.wait([ windowManager.setTitleBarStyle(TitleBarStyle.normal), windowManager.setMinimumSize(const Size(400, 700)), windowManager.setBounds(_lastWindowBounds), @@ -1009,8 +1009,9 @@ class PlPlayerController { /// 播放事件监听 void startListeners() { + final controllerStream = videoPlayerController!.stream; subscriptions = { - videoPlayerController!.stream.playing.listen((event) { + controllerStream.playing.listen((event) { WakelockPlus.toggle(enable: event); if (event) { if (_shouldSetPip) { @@ -1039,7 +1040,7 @@ class PlPlayerController { makeHeartBeat(positionSeconds.value, type: HeartBeatType.status); } }), - videoPlayerController!.stream.completed.listen((event) { + controllerStream.completed.listen((event) { if (event) { playerStatus.value = PlayerStatus.completed; @@ -1052,7 +1053,7 @@ class PlPlayerController { } makeHeartBeat(positionSeconds.value, type: HeartBeatType.completed); }), - videoPlayerController!.stream.position.listen((event) { + controllerStream.position.listen((event) { position.value = event; updatePositionSecond(); if (!isSliderMoving.value) { @@ -1066,14 +1067,14 @@ class PlPlayerController { } makeHeartBeat(event.inSeconds); }), - videoPlayerController!.stream.duration.listen((Duration event) { + controllerStream.duration.listen((Duration event) { duration.value = event; }), - videoPlayerController!.stream.buffer.listen((Duration event) { + controllerStream.buffer.listen((Duration event) { buffered.value = event; updateBufferedSecond(); }), - videoPlayerController!.stream.buffering.listen((bool event) { + controllerStream.buffering.listen((bool event) { isBuffering.value = event; videoPlayerServiceHandler?.onStatusChange( playerStatus.value, @@ -1082,14 +1083,14 @@ class PlPlayerController { ); }), if (kDebugMode) - videoPlayerController!.stream.log.listen(((PlayerLog log) { + controllerStream.log.listen(((PlayerLog log) { if (log.level == 'error' || log.level == 'fatal') { Utils.reportError('${log.prefix}: ${log.text}', null); } else { debugPrint(log.toString()); } })), - videoPlayerController!.stream.error.listen((String event) { + controllerStream.error.listen((String event) { if (isFileSource && event.startsWith("Failed to open file")) { return; } @@ -1107,7 +1108,7 @@ class PlPlayerController { //tcp: ffurl_read returned 0xffffff99 event.startsWith('tcp: ffurl_read returned ')) { EasyThrottle.throttle( - 'videoPlayerController!.stream.error.listen', + 'controllerStream.error.listen', const Duration(milliseconds: 10000), () { Future.delayed(const Duration(milliseconds: 3000), () async { @@ -1141,7 +1142,7 @@ class PlPlayerController { SmartDialog.showToast('视频加载错误, $event'); } }), - // videoPlayerController!.stream.volume.listen((event) { + // controllerStream.volume.listen((event) { // if (!mute.value && _volumeBeforeMute != event) { // _volumeBeforeMute = event / 100; // } @@ -1167,8 +1168,8 @@ class PlPlayerController { } /// 移除事件监听 - Future removeListeners() async { - await Future.wait(subscriptions.map((e) => e.cancel())); + Future removeListeners() { + return Future.wait(subscriptions.map((e) => e.cancel())); } /// 跳转至指定位置 @@ -1405,7 +1406,7 @@ class PlPlayerController { } /// 设置后台播放 - Future setBackgroundPlay(bool val) async { + void setBackgroundPlay(bool val) { videoPlayerServiceHandler?.enableBackgroundPlay = val; if (!tempPlayerConf) { setting.put(SettingBoxKey.enableBackgroundPlay, val); diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 3cbbc3c85..8dc368059 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -655,7 +655,7 @@ class _PLVideoPlayerState extends State /// 字幕 BottomControlType.subtitle => Obx( - () => videoDetailController.subtitles.isEmpty == true + () => videoDetailController.subtitles.isEmpty ? const SizedBox.shrink() : PopupMenuButton( tooltip: '字幕', diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index ac4dade99..02eb3f116 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -11,7 +11,7 @@ import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:audio_service/audio_service.dart'; import 'package:get/get_utils/get_utils.dart'; -Future initAudioService() async { +Future initAudioService() { return AudioService.init( builder: VideoPlayerServiceHandler.new, config: const AudioServiceConfig( diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index e7248c5ee..6281fe627 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -568,7 +568,7 @@ abstract class RequestUtils { onClose: (Map message) { SmartDialog.showToast('关闭验证'); }, - onResult: (Map message) async { + onResult: (Map message) { if (kDebugMode) debugPrint("Captcha result: $message"); String code = message["code"]; if (code == "1") {