diff --git a/lib/common/widgets/disabled_icon.dart b/lib/common/widgets/disabled_icon.dart index 328de9349..3f38bc222 100644 --- a/lib/common/widgets/disabled_icon.dart +++ b/lib/common/widgets/disabled_icon.dart @@ -20,20 +20,16 @@ class DisabledIcon extends SingleChildRenderObjectWidget { final StrokeCap strokeCap; final double lineLengthScale; + Icon? get _icon => child is Icon ? child as Icon : null; + @override RenderObject createRenderObject(BuildContext context) { late final iconTheme = IconTheme.of(context); + final icon = _icon; return RenderMaskedIcon( disable: disable, - iconSize: - iconSize ?? - (child is Icon ? (child as Icon).size : null) ?? - iconTheme.size ?? - 24.0, - color: - color ?? - (child is Icon ? (child as Icon).color : null) ?? - iconTheme.color!, + iconSize: iconSize ?? icon?.size ?? iconTheme.size ?? 24.0, + color: color ?? icon?.color ?? iconTheme.color!, strokeCap: strokeCap, lineLengthScale: lineLengthScale, ); @@ -42,17 +38,11 @@ class DisabledIcon extends SingleChildRenderObjectWidget { @override void updateRenderObject(BuildContext context, RenderMaskedIcon renderObject) { late final iconTheme = IconTheme.of(context); + final icon = _icon; renderObject ..disable = disable - ..iconSize = - iconSize ?? - (child is Icon ? (child as Icon).size : null) ?? - iconTheme.size ?? - 24.0 - ..color = - color ?? - (child is Icon ? (child as Icon).color : null) ?? - iconTheme.color! + ..iconSize = iconSize ?? icon?.size ?? iconTheme.size ?? 24.0 + ..color = color ?? icon?.color ?? iconTheme.color! ..strokeCap = strokeCap ..lineLengthScale = lineLengthScale; } diff --git a/lib/common/widgets/only_layout_widget.dart b/lib/common/widgets/only_layout_widget.dart index 491b7ba2d..d78a46e15 100644 --- a/lib/common/widgets/only_layout_widget.dart +++ b/lib/common/widgets/only_layout_widget.dart @@ -43,42 +43,3 @@ class NoRenderLayoutBox extends RenderProxyBox { @override void paint(PaintingContext context, Offset offset) {} } - -class LayoutSizeWidget extends SingleChildRenderObjectWidget { - const LayoutSizeWidget({ - super.key, - super.child, - required this.onPerformLayout, - }); - - final LayoutCallback onPerformLayout; - - @override - RenderObject createRenderObject(BuildContext context) => - RenderLayoutBox(onPerformLayout: onPerformLayout); - - @override - void updateRenderObject( - BuildContext context, - RenderLayoutBox renderObject, - ) { - super.updateRenderObject(context, renderObject); - renderObject.onPerformLayout = onPerformLayout; - } -} - -class RenderLayoutBox extends RenderProxyBox { - RenderLayoutBox({required this.onPerformLayout}); - - LayoutCallback onPerformLayout; - - Size? _size; - - @override - void performLayout() { - super.performLayout(); - if (_size != size) { - onPerformLayout(_size = size); - } - } -} diff --git a/lib/common/widgets/sliver_wrap.dart b/lib/common/widgets/sliver_wrap.dart index a2abcd3e6..492a8b8fd 100644 --- a/lib/common/widgets/sliver_wrap.dart +++ b/lib/common/widgets/sliver_wrap.dart @@ -96,7 +96,6 @@ class RenderSliverFixedWrap extends RenderSliverMultiBoxAdaptor { set runSpacing(double value) { if (_runSpacing == value) return; _runSpacing = value; - markRowsDirty(); markNeedsLayout(); } @@ -168,20 +167,20 @@ class RenderSliverFixedWrap extends RenderSliverMultiBoxAdaptor { } } - bool _buildNextRow(int start, BoxConstraints childConstraints) { + bool _buildNextRow(int start, BoxConstraints constraints) { final int childCount = childManager.childCount; if (start >= childCount) { return false; } - final crossAxisExtent = constraints.crossAxisExtent; + final crossAxisExtent = this.constraints.crossAxisExtent; final List widths = []; int idx = start; RenderBox? child; for (var totalWidth = -_spacing; idx < childCount; idx++) { - child = _getOrCreateChildAtIndex(idx, childConstraints, child); + child = _getOrCreateChildAtIndex(idx, constraints, child); final childWidth = _childCrossExtent(child); totalWidth += childWidth + _spacing; @@ -215,24 +214,20 @@ class RenderSliverFixedWrap extends RenderSliverMultiBoxAdaptor { final firstNeededRow = math.max(0, firstCacheOffset ~/ rowHeight); final lastNeededRow = math.max(0, lastCacheOffset ~/ rowHeight); + final childConstraints = constraints.toFixedConstraints(_mainAxisExtent); + if (firstChild == null) { if (!addInitialChild()) { geometry = SliverGeometry.zero; childManager.didFinishLayout(); return; } - firstChild!.layout( - constraints.toFixedConstraints(_mainAxisExtent), - parentUsesSize: true, - ); + firstChild!.layout(childConstraints, parentUsesSize: true); } while (_rows.length <= lastNeededRow) { final int startIndex = _rows.isEmpty ? 0 : _rows.last.endIndex + 1; - if (!_buildNextRow( - startIndex, - constraints.toFixedConstraints(_mainAxisExtent), - )) { + if (!_buildNextRow(startIndex, childConstraints)) { break; } } @@ -256,11 +251,7 @@ class RenderSliverFixedWrap extends RenderSliverMultiBoxAdaptor { final rowStartOffset = r * rowHeight; double crossOffset = 0.0; for (var i = row.startIndex; i <= row.endIndex; i++) { - child = _getOrCreateChildAtIndex( - i, - constraints.toFixedConstraints(_mainAxisExtent), - child, - ); + child = _getOrCreateChildAtIndex(i, childConstraints, child); (child.parentData as SliverWrapParentData) ..layoutOffset = rowStartOffset ..crossAxisOffset = crossOffset; diff --git a/lib/models/video/play/url.dart b/lib/models/video/play/url.dart index d728e313c..7bfab6f01 100644 --- a/lib/models/video/play/url.dart +++ b/lib/models/video/play/url.dart @@ -163,19 +163,15 @@ class Dash { video = (json['video'] as List?) ?.map((e) => VideoItem.fromJson(e)) .toList(); - audio = (json['audio'] as List?) - ?.map((e) => AudioItem.fromJson(e)) - .toList(); - if (json['dolby']?['audio'] case List list) { - (audio ??= []).insertAll( - 0, - list.map((e) => AudioItem.fromJson(e)), - ); - } - final flacAudio = json['flac']?['audio']; - if (flacAudio != null) { - (audio ??= []).insert(0, AudioItem.fromJson(flacAudio)); - } + final audio = [ + if (json['flac']?['audio'] case Map flac) + AudioItem.fromJson(flac), + if (json['dolby']?['audio'] case List list) + ...list.map((e) => AudioItem.fromJson(e)), + if (json['audio'] case List list) + ...list.map((e) => AudioItem.fromJson(e)), + ]; + this.audio = audio.isEmpty ? null : audio; } } diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index bfc60217a..254d36d8c 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -6,7 +6,6 @@ import 'package:PiliPlus/grpc/dm.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/data_source.dart'; -import 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -68,8 +67,8 @@ class PlDanmakuController { if (elems.isEmpty) return; final uniques = HashMap(); - final shouldFilter = _plPlayerController.filters.count != 0; - final danmakuWeight = DanmakuOptions.danmakuWeight; + final filters = _plPlayerController.filters; + final shouldFilter = filters.count != 0; for (final element in elems) { if (_isLogin) { element.isSelf = element.midHash == _plPlayerController.midHash; @@ -86,8 +85,7 @@ class PlDanmakuController { } } - if (element.weight < danmakuWeight || - (shouldFilter && _plPlayerController.filters.remove(element))) { + if (shouldFilter && filters.remove(element)) { continue; } } diff --git a/lib/pages/save_panel/view.dart b/lib/pages/save_panel/view.dart index 2d8c121e2..71a7cf596 100644 --- a/lib/pages/save_panel/view.dart +++ b/lib/pages/save_panel/view.dart @@ -1,6 +1,3 @@ -import 'dart:typed_data'; -import 'dart:ui'; - import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; @@ -292,14 +289,15 @@ class _SavePanelState extends State { } SmartDialog.showLoading(); try { - RenderRepaintBoundary boundary = + final boundary = boundaryKey.currentContext!.findRenderObject() as RenderRepaintBoundary; final image = await boundary.toImage(pixelRatio: 3); - ByteData? byteData = await image.toByteData(format: ImageByteFormat.png); - Uint8List pngBytes = byteData!.buffer.asUint8List(); - String picName = - "${Constants.appName}_${DateFormat('yyyyMMddHHmmss').format(DateTime.now())}"; + final byteData = await image.toByteData(format: .png); + image.dispose(); + final pngBytes = byteData!.buffer.asUint8List(); + final picName = + "${Constants.appName}_${itemType}_${DateFormat('yyyyMMddHHmmss').format(DateTime.now())}"; if (isShare) { Get.back(); SmartDialog.dismiss(); @@ -350,8 +348,7 @@ class _SavePanelState extends State { top: 12 + padding.top, bottom: 80 + padding.bottom, ), - child: GestureDetector( - onTap: () {}, + child: Listener( child: Container( width: maxWidth, padding: const EdgeInsets.symmetric(horizontal: 12), @@ -361,7 +358,7 @@ class _SavePanelState extends State { clipBehavior: Clip.hardEdge, decoration: BoxDecoration( color: theme.colorScheme.surface, - borderRadius: const BorderRadius.all(Radius.circular(12)), + borderRadius: const .all(.circular(12)), ), child: AnimatedSize( curve: Curves.easeInOut, @@ -393,40 +390,33 @@ class _SavePanelState extends State { Container( height: 81, clipBehavior: Clip.hardEdge, - margin: const EdgeInsets.symmetric( - horizontal: 12, - ), - padding: const EdgeInsets.all(8), + margin: const .symmetric(horizontal: 12), + padding: const .all(8), decoration: BoxDecoration( color: theme.colorScheme.onInverseSurface, - borderRadius: const BorderRadius.all( - Radius.circular(8), - ), + borderRadius: const .all(.circular(8)), ), child: Row( children: [ NetworkImgLayer( src: cover!, height: coverSize, - width: coverType == _CoverType.def16_9 + width: coverType == .def16_9 ? coverSize * StyleString.aspectRatio16x9 : coverSize, quality: 100, - borderRadius: const BorderRadius.all( - Radius.circular(6), - ), + borderRadius: const .all(.circular(6)), ), const SizedBox(width: 10), Expanded( child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: .start, children: [ Text( '$title\n', maxLines: 2, - overflow: TextOverflow.ellipsis, + overflow: .ellipsis, ), if (pubdate != null) ...[ const Spacer(), @@ -466,8 +456,7 @@ class _SavePanelState extends State { Text( '@$uname', maxLines: 1, - overflow: - TextOverflow.ellipsis, + overflow: .ellipsis, style: TextStyle( color: theme .colorScheme @@ -485,9 +474,7 @@ class _SavePanelState extends State { ), Text( DateFormatUtils.longFormatDs - .format( - DateTime.now(), - ), + .format(.now()), textAlign: TextAlign.end, style: TextStyle( fontSize: 13, @@ -504,12 +491,8 @@ class _SavePanelState extends State { child: Container( width: 88, height: 88, - margin: const EdgeInsets.all( - 12, - ), - padding: const EdgeInsets.all( - 3, - ), + margin: const .all(12), + padding: const .all(3), color: theme.brightness.isDark ? Colors.white : theme.colorScheme.surface, diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index d64163a06..124949cf6 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -357,7 +357,6 @@ class _SearchPageState extends State { runSpacing: 8, delegate: SliverChildBuilderDelegate( addAutomaticKeepAlives: false, - addRepaintBoundaries: false, childCount: list.length, (context, index) => SearchText( text: list[index], diff --git a/lib/pages/video/widgets/header_mixin.dart b/lib/pages/video/widgets/header_mixin.dart index deb94e50c..84a48f608 100644 --- a/lib/pages/video/widgets/header_mixin.dart +++ b/lib/pages/video/widgets/header_mixin.dart @@ -202,9 +202,9 @@ mixin HeaderMixin on State { data: sliderTheme, child: Slider( min: 0, - max: 10, + max: 11, value: DanmakuOptions.danmakuWeight.toDouble(), - divisions: 10, + divisions: 11, label: DanmakuOptions.danmakuWeight.toString(), onChanged: updateDanmakuWeight, ), diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index bb4b0b331..78578d6ce 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -7,7 +7,6 @@ import 'dart:ui' as ui; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/http/browser_ua.dart'; import 'package:PiliPlus/http/constants.dart'; -import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/common/account_type.dart'; @@ -47,7 +46,6 @@ import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:archive/archive.dart' show getCrc32; import 'package:canvas_danmaku/canvas_danmaku.dart'; -import 'package:dio/dio.dart' show Options; import 'package:easy_debounce/easy_throttle.dart'; import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -1659,34 +1657,7 @@ class PlPlayerController with BlockConfigMixin { } Future getVideoShot() async { - try { - final res = await Request().get( - '/x/player/videoshot', - queryParameters: { - // 'aid': IdUtils.bv2av(_bvid), - 'bvid': _bvid, - 'cid': cid, - 'index': 1, - }, - options: Options( - headers: { - 'user-agent': BrowserUa.pc, - 'referer': 'https://www.bilibili.com/video/$bvid', - }, - ), - ); - if (res.data['code'] == 0) { - final data = VideoShotData.fromJson(res.data['data']); - if (data.index.isNotEmpty) { - videoShot = Success(data); - return; - } - } - videoShot = const Error(null); - } catch (e) { - videoShot = const Error(null); - if (kDebugMode) debugPrint('getVideoShot: $e'); - } + videoShot = await VideoHttp.videoshot(bvid: bvid, cid: cid!); } void takeScreenshot() {