Compare commits

...

6 Commits

Author SHA1 Message Date
dom
0b4ed25891 Release 2.0.4
Signed-off-by: dom <githubaccount56556@proton.me>
2026-04-14 13:59:59 +08:00
dom
372c677e8f opt android orientation
Signed-off-by: dom <githubaccount56556@proton.me>
2026-04-14 13:46:47 +08:00
dom
9a6f335e48 upgrade deps
Signed-off-by: dom <githubaccount56556@proton.me>
2026-04-14 13:46:47 +08:00
dom
f9441db232 opt scroll view
Signed-off-by: dom <githubaccount56556@proton.me>
2026-04-14 13:46:47 +08:00
dom
4de43faa2e tweaks
Signed-off-by: dom <githubaccount56556@proton.me>
2026-04-14 13:46:42 +08:00
dom
ba372a101b opt avatar
Signed-off-by: dom <githubaccount56556@proton.me>
2026-04-14 10:38:18 +08:00
135 changed files with 4738 additions and 198 deletions

View File

@@ -0,0 +1,94 @@
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'
show RenderStack, BoxHitTestResult, BoxHitTestEntry;
class ExtraHitTestStack extends Stack {
const ExtraHitTestStack({
super.key,
super.alignment,
super.textDirection,
super.fit,
super.clipBehavior,
super.children,
});
@override
RenderExtraHitTestStack createRenderObject(BuildContext context) {
return RenderExtraHitTestStack(
alignment: alignment,
textDirection: textDirection ?? Directionality.maybeOf(context),
fit: fit,
clipBehavior: clipBehavior,
);
}
@override
void updateRenderObject(
BuildContext context,
RenderExtraHitTestStack renderObject,
) {
renderObject
..alignment = alignment
..textDirection = textDirection ?? Directionality.maybeOf(context)
..fit = fit
..clipBehavior = clipBehavior;
}
}
class RenderExtraHitTestStack extends RenderStack {
RenderExtraHitTestStack({
super.children,
super.alignment,
super.textDirection,
super.fit,
super.clipBehavior,
});
@override
bool hitTest(BoxHitTestResult result, {required Offset position}) {
assert(() {
if (!hasSize) {
if (debugNeedsLayout) {
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary(
'Cannot hit test a render box that has never been laid out.',
),
describeForError(
'The hitTest() method was called on this RenderBox',
),
ErrorDescription(
"Unfortunately, this object's geometry is not known at this time, "
'probably because it has never been laid out. '
'This means it cannot be accurately hit-tested.',
),
ErrorHint(
'If you are trying '
'to perform a hit test during the layout phase itself, make sure '
"you only hit test nodes that have completed layout (e.g. the node's "
'children, after their layout() method has been called).',
),
]);
}
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary('Cannot hit test a render box with no size.'),
describeForError('The hitTest() method was called on this RenderBox'),
ErrorDescription(
'Although this node is not marked as needing layout, '
'its size is not set.',
),
ErrorHint(
'A RenderBox object must have an '
'explicit size before it can be hit-tested. Make sure '
'that the RenderBox in question sets its size during layout.',
),
]);
}
return true;
}());
if (hitTestChildren(result, position: position) || hitTestSelf(position)) {
result.add(BoxHitTestEntry(this, position));
return true;
}
return false;
}
}

View File

@@ -4,8 +4,9 @@
import 'dart:math' as math;
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' hide BoxScrollView;
import 'package:flutter/rendering.dart';
class ChatListView extends BoxScrollView {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,208 @@
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// @docImport 'package:flutter/material.dart';
///
/// @docImport 'overscroll_indicator.dart';
/// @docImport 'viewport.dart';
// ignore_for_file: dangling_library_doc_comments
import 'dart:math' as math;
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scrollable.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'
hide EdgeDraggingAutoScroller, Scrollable, ScrollableState;
/// An auto scroller that scrolls the [scrollable] if a drag gesture drags close
/// to its edge.
///
/// The scroll velocity is controlled by the [velocityScalar]:
///
/// velocity = (distance of overscroll) * [velocityScalar].
class EdgeDraggingAutoScroller {
/// Creates a auto scroller that scrolls the [scrollable].
EdgeDraggingAutoScroller(
this.scrollable, {
this.onScrollViewScrolled,
required this.velocityScalar,
});
/// The [Scrollable] this auto scroller is scrolling.
final ScrollableState scrollable;
/// Called when a scroll view is scrolled.
///
/// The scroll view may be scrolled multiple times in a row until the drag
/// target no longer triggers the auto scroll. This callback will be called
/// in between each scroll.
final VoidCallback? onScrollViewScrolled;
/// {@template flutter.widgets.EdgeDraggingAutoScroller.velocityScalar}
/// The velocity scalar per pixel over scroll.
///
/// It represents how the velocity scale with the over scroll distance. The
/// auto-scroll velocity = (distance of overscroll) * velocityScalar.
/// {@endtemplate}
final double velocityScalar;
late Rect _dragTargetRelatedToScrollOrigin;
/// Whether the auto scroll is in progress.
bool get scrolling => _scrolling;
bool _scrolling = false;
double _offsetExtent(Offset offset, Axis scrollDirection) {
return switch (scrollDirection) {
Axis.horizontal => offset.dx,
Axis.vertical => offset.dy,
};
}
double _sizeExtent(Size size, Axis scrollDirection) {
return switch (scrollDirection) {
Axis.horizontal => size.width,
Axis.vertical => size.height,
};
}
AxisDirection get _axisDirection => scrollable.axisDirection;
Axis get _scrollDirection => axisDirectionToAxis(_axisDirection);
/// Starts the auto scroll if the [dragTarget] is close to the edge.
///
/// The scroll starts to scroll the [scrollable] if the target rect is close
/// to the edge of the [scrollable]; otherwise, it remains stationary.
///
/// If the scrollable is already scrolling, calling this method updates the
/// previous dragTarget to the new value and continues scrolling if necessary.
void startAutoScrollIfNecessary(Rect dragTarget) {
final Offset deltaToOrigin = scrollable.deltaToScrollOrigin;
_dragTargetRelatedToScrollOrigin = dragTarget.translate(
deltaToOrigin.dx,
deltaToOrigin.dy,
);
if (_scrolling) {
// The change will be picked up in the next scroll.
return;
}
assert(!_scrolling);
_scroll();
}
/// Stop any ongoing auto scrolling.
void stopAutoScroll() {
_scrolling = false;
}
Future<void> _scroll() async {
final scrollRenderBox = scrollable.context.findRenderObject()! as RenderBox;
final Matrix4 transform = scrollRenderBox.getTransformTo(null);
final Rect globalRect = MatrixUtils.transformRect(
transform,
Rect.fromLTRB(
0,
0,
scrollRenderBox.size.width,
scrollRenderBox.size.height,
),
);
final Rect transformedDragTarget = MatrixUtils.transformRect(
transform,
_dragTargetRelatedToScrollOrigin,
);
assert(
(globalRect.size.width + precisionErrorTolerance) >=
transformedDragTarget.size.width &&
(globalRect.size.height + precisionErrorTolerance) >=
transformedDragTarget.size.height,
'Drag target size is larger than scrollable size, which may cause bouncing',
);
_scrolling = true;
double? newOffset;
const overDragMax = 20.0;
final Offset deltaToOrigin = scrollable.deltaToScrollOrigin;
final Offset viewportOrigin = globalRect.topLeft.translate(
deltaToOrigin.dx,
deltaToOrigin.dy,
);
final double viewportStart = _offsetExtent(
viewportOrigin,
_scrollDirection,
);
final double viewportEnd =
viewportStart + _sizeExtent(globalRect.size, _scrollDirection);
final double proxyStart = _offsetExtent(
_dragTargetRelatedToScrollOrigin.topLeft,
_scrollDirection,
);
final double proxyEnd = _offsetExtent(
_dragTargetRelatedToScrollOrigin.bottomRight,
_scrollDirection,
);
switch (_axisDirection) {
case AxisDirection.up:
case AxisDirection.left:
if (proxyEnd > viewportEnd &&
scrollable.position.pixels > scrollable.position.minScrollExtent) {
final double overDrag = math.min(proxyEnd - viewportEnd, overDragMax);
newOffset = math.max(
scrollable.position.minScrollExtent,
scrollable.position.pixels - overDrag,
);
} else if (proxyStart < viewportStart &&
scrollable.position.pixels < scrollable.position.maxScrollExtent) {
final double overDrag = math.min(
viewportStart - proxyStart,
overDragMax,
);
newOffset = math.min(
scrollable.position.maxScrollExtent,
scrollable.position.pixels + overDrag,
);
}
case AxisDirection.right:
case AxisDirection.down:
if (proxyStart < viewportStart &&
scrollable.position.pixels > scrollable.position.minScrollExtent) {
final double overDrag = math.min(
viewportStart - proxyStart,
overDragMax,
);
newOffset = math.max(
scrollable.position.minScrollExtent,
scrollable.position.pixels - overDrag,
);
} else if (proxyEnd > viewportEnd &&
scrollable.position.pixels < scrollable.position.maxScrollExtent) {
final double overDrag = math.min(proxyEnd - viewportEnd, overDragMax);
newOffset = math.min(
scrollable.position.maxScrollExtent,
scrollable.position.pixels + overDrag,
);
}
}
if (newOffset == null ||
(newOffset - scrollable.position.pixels).abs() < 1.0) {
// Drag should not trigger scroll.
_scrolling = false;
return;
}
final duration = Duration(milliseconds: (1000 / velocityScalar).round());
await scrollable.position.animateTo(
newOffset,
duration: duration,
curve: Curves.linear,
);
onScrollViewScrolled?.call();
if (_scrolling) {
await _scroll();
}
}
}

View File

@@ -0,0 +1,39 @@
import 'package:flutter/gestures.dart'
show VerticalDragGestureRecognizer, PointerEvent, RecognizerCallback;
typedef IsDyAllowed = bool Function(double dy);
class CustomVerticalDragGestureRecognizer
extends VerticalDragGestureRecognizer {
CustomVerticalDragGestureRecognizer({
super.debugOwner,
super.supportedDevices,
super.allowedButtonsFilter,
});
IsDyAllowed? isDyAllowed;
bool _isDyAllowed = false;
@override
bool isPointerAllowed(PointerEvent event) {
_isDyAllowed = isDyAllowed?.call(event.localPosition.dy) ?? true;
return super.isPointerAllowed(event);
}
@override
T? invokeCallback<T>(
String name,
RecognizerCallback<T> callback, {
String Function()? debugReport,
}) {
if (!_isDyAllowed) return null;
return super.invokeCallback(name, callback, debugReport: debugReport);
}
@override
void dispose() {
isDyAllowed = null;
super.dispose();
}
}

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/m3e_loading_indicator.dart';
import 'package:flutter/material.dart';
@@ -8,13 +9,13 @@ const Widget linearLoading = SliverToBoxAdapter(
child: LinearProgressIndicator(),
);
const Widget scrollableError = CustomScrollView(slivers: [HttpError()]);
const Widget scrollableError = customScrollView(slivers: [HttpError()]);
Widget scrollErrorWidget({
String? errMsg,
VoidCallback? onReload,
ScrollController? controller,
}) => CustomScrollView(
}) => customScrollView(
controller: controller,
slivers: [
HttpError(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/extra_hittest_stack.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models/common/avatar_badge_type.dart';
import 'package:PiliPlus/models/common/image_type.dart';
@@ -82,7 +83,7 @@ class PendantAvatar extends StatelessWidget {
child: avatar,
);
}
Widget child = Stack(
Widget child = ExtraHitTestStack(
clipBehavior: .none,
alignment: .center,
children: [

View File

@@ -8,6 +8,7 @@ import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/dialog/export_import.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/services/logger.dart';
import 'package:PiliPlus/utils/accounts.dart';
@@ -90,7 +91,7 @@ class _AboutPageState extends State<AboutPage> {
return Scaffold(
appBar: showAppBar ? AppBar(title: const Text('关于')) : null,
resizeToAvoidBottomInset: false,
body: ListView(
body: listView(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/models/common/badge_type.dart';
@@ -83,7 +84,7 @@ class _ArticlePageState extends CommonDynPageState<ArticlePage> {
if (isPortrait) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: padding),
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
@@ -112,7 +113,7 @@ class _ArticlePageState extends CommonDynPageState<ArticlePage> {
children: [
Expanded(
flex: flex,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
@@ -144,7 +145,7 @@ class _ArticlePageState extends CommonDynPageState<ArticlePage> {
resizeToAvoidBottomInset: false,
body: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/constants.dart';
@@ -38,7 +39,7 @@ class _ArticleListPageState extends State<ArticleListPage> with GridMixin {
color: theme.colorScheme.surface,
child: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
Obx(() => _buildHeader(theme, _controller.list.value)),

View File

@@ -4,6 +4,7 @@ import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image_viewer/hero.dart';
@@ -202,7 +203,7 @@ class _AudioPageState extends State<AudioPage> {
builder: (context) {
final theme = Theme.of(context);
final colorScheme = theme.colorScheme;
Widget child = CustomScrollView(
Widget child = customScrollView(
controller: scrollController,
physics: _controller.reachStart
? null

View File

@@ -43,7 +43,7 @@ class BlackListController
..value.data!.removeAt(index)
..refresh();
total.value -= 1;
SmartDialog.showToast('操作成功');
SmartDialog.showToast('移除成功');
}
},
);

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -45,7 +46,7 @@ class _BlackListPageState extends State<BlackListPage> {
),
body: refreshIndicator(
onRefresh: _blackListController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: _blackListController.scrollController,
slivers: [

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
@@ -54,7 +55,7 @@ class _BubblePageState extends State<BubblePage>
final padding = MediaQuery.viewPaddingOf(context);
Widget child = refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: _controller.scrollController,
slivers: [

View File

@@ -239,7 +239,7 @@ mixin FavMixin on TripleMixin {
if (result.isSuccess) {
updateFavCount(hasFav ? -1 : 1);
this.hasFav.value = !hasFav;
SmartDialog.showToast('✅ 快速收藏/取消收藏成功');
SmartDialog.showToast('${hasFav ? '取消' : ''}收藏成功');
} else {
res.toast();
}
@@ -283,7 +283,7 @@ mixin FavMixin on TripleMixin {
updateFavCount(newVal ? 1 : -1);
hasFav.value = newVal;
}
SmartDialog.showToast('操作成功');
SmartDialog.showToast('${newVal ? '' : '取消'}收藏成功');
} else {
result.toast();
}

View File

@@ -56,7 +56,7 @@ abstract class CommonWhisperController<R>
if (res.isSuccess) {
item.isMuted = !isMuted;
loadingState.refresh();
SmartDialog.showToast('操作成功');
SmartDialog.showToast('设置成功');
} else {
res.toast();
}

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/appbar/appbar.dart';
import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -38,7 +39,7 @@ abstract class CommonSearchPageState<S extends StatefulWidget, R, T>
Widget _build(bool multiSelect) {
return Scaffold(
appBar: _buildBar(multiSelect),
body: CustomScrollView(
body: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: controller.scrollController,
slivers: [

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
@@ -84,7 +85,7 @@ class _DanmakuBlockPageState extends State<DanmakuBlockPage> {
if (list.isEmpty) {
return scrollableError;
}
return ListView.builder(
return ExtendedListView.builder(
itemCount: list.length,
padding: EdgeInsets.only(
bottom: MediaQuery.viewPaddingOf(context).bottom + 100,

View File

@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
@@ -83,7 +84,7 @@ class _DLNAPageState extends State<DLNAPage> {
const SizedBox(width: 6),
],
),
body: CustomScrollView(
body: customScrollView(
slivers: [
if (_isSearching) linearLoading,
ViewSliverSafeArea(sliver: _buildBody(colorScheme)),

View File

@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:PiliPlus/common/widgets/appbar/appbar.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
import 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';
@@ -143,7 +144,7 @@ class _DownloadDetailPageState extends State<DownloadDetailPage>
],
),
),
body: CustomScrollView(
body: customScrollView(
slivers: [
ViewSliverSafeArea(
sliver: Obx(() {

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/widgets/appbar/appbar.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
import 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';
@@ -63,7 +64,7 @@ class _DownloadingPageState extends State<DownloadingPage>
],
),
),
body: CustomScrollView(
body: customScrollView(
slivers: [
ViewSliverSafeArea(
sliver: Obx(() {

View File

@@ -6,6 +6,7 @@ import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';
import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/select_mask.dart';
@@ -122,7 +123,7 @@ class _DownloadPageState extends State<DownloadPage> {
),
body: Padding(
padding: EdgeInsets.only(left: padding.left, right: padding.right),
child: CustomScrollView(
child: customScrollView(
slivers: [
Obx(() {
final entry =

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';
import 'package:PiliPlus/models/common/image_type.dart';
@@ -41,7 +42,7 @@ class _UpPanelState extends State<UpPanel> {
final upData = controller.upState.value.data;
final List<UpItem> upList = upData.upList;
final List<LiveUserItem>? liveList = upData.liveUsers?.items;
return CustomScrollView(
return customScrollView(
scrollDirection: isTop ? Axis.horizontal : Axis.vertical,
physics: const AlwaysScrollableScrollPhysics(),
controller: controller.scrollController,

View File

@@ -1,6 +1,7 @@
import 'dart:io' show File;
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/time_picker.dart';
import 'package:PiliPlus/models/dynamics/vote_model.dart';
@@ -57,7 +58,7 @@ class _CreateVotePageState extends State<CreateVotePage> {
appBar: AppBar(
title: Text('${_controller.voteId != null ? '' : '发起'}投票'),
),
body: ListView(
body: listView(
padding: EdgeInsets.only(
left: padding.left + 16,
right: padding.right + 16,

View File

@@ -2,6 +2,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/http/constants.dart';
@@ -248,7 +249,7 @@ class _DynamicDetailPageState extends CommonDynPageState<DynamicDetailPage> {
if (isPortrait) {
child = Padding(
padding: EdgeInsets.symmetric(horizontal: padding),
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
@@ -275,7 +276,7 @@ class _DynamicDetailPageState extends CommonDynPageState<DynamicDetailPage> {
children: [
Expanded(
flex: flex,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
@@ -307,7 +308,7 @@ class _DynamicDetailPageState extends CommonDynPageState<DynamicDetailPage> {
resizeToAvoidBottomInset: false,
body: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_topic.dart'
as topic_sheet;
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';
@@ -184,7 +185,7 @@ class _DynMentionPanelState
}
return false;
},
child: CustomScrollView(
child: customScrollView(
controller: widget.scrollController,
slivers: [
Obx(

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_topic.dart'
as topic_sheet;
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';
@@ -191,7 +192,7 @@ class _SelectTopicPanelState
Loading() => m3eLoading,
Success<List<TopicItem>?>(:final response) =>
response != null && response.isNotEmpty
? ListView.builder(
? ExtendedListView.builder(
padding: EdgeInsets.only(
bottom: MediaQuery.viewPaddingOf(context).bottom + 100,
),

View File

@@ -1,6 +1,7 @@
import 'dart:async';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';
@@ -70,7 +71,7 @@ class _DynamicsTabPageState extends State<DynamicsTabPage>
dynamicsController.queryFollowUp();
return controller.onRefresh();
},
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: controller.scrollController,
slivers: [

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
@@ -66,7 +67,7 @@ class _DynTopicPageState extends State<DynTopicPage> with DynMixin {
),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
@@ -26,7 +27,7 @@ class _DynTopicRcmdPageState extends State<DynTopicRcmdPage> {
appBar: AppBar(title: const Text('话题')),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
ViewSliverSafeArea(

View File

@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
@@ -280,7 +281,7 @@ class _EpisodePanelState extends State<EpisodePanel>
) {
final isCurrTab = tabIndex == widget.initialTabIndex;
return KeepAliveWrapper(
child: CustomScrollView(
child: customScrollView(
reverse: _isReversed[tabIndex],
physics: const AlwaysScrollableScrollPhysics(),
controller: _itemScrollController[tabIndex],

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_article/item.dart';
@@ -30,7 +31,7 @@ class _FavArticlePageState extends State<FavArticlePage>
super.build(context);
return refreshIndicator(
onRefresh: _favArticleController.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _favArticleController.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_cheese/item.dart';
@@ -29,7 +30,7 @@ class _FavCheesePageState extends State<FavCheesePage>
final ThemeData theme = Theme.of(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_note/list.dart';
@@ -43,7 +44,7 @@ class _FavNoteChildPageState extends State<FavNoteChildPage>
children: [
refreshIndicator(
onRefresh: _favNoteController.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _favNoteController.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/fav_pgc_item.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';
@@ -49,7 +50,7 @@ class _FavPgcChildPageState extends State<FavPgcChildPage>
children: [
refreshIndicator(
onRefresh: _favPgcController.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _favPgcController.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'
show m3eLoading;
@@ -33,7 +34,7 @@ class _FavTopicPageState extends State<FavTopicPage>
final ThemeData theme = Theme.of(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
@@ -28,7 +29,7 @@ class _FavVideoPageState extends State<FavVideoPage>
super.build(context);
return refreshIndicator(
onRefresh: _favController.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _favController.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/fav.dart';
@@ -100,7 +101,7 @@ class _FavDetailPageState extends State<FavDetailPage> with GridMixin {
),
body: refreshIndicator(
onRefresh: _favDetailController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: _favDetailController.scrollController,
slivers: [

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
@@ -42,7 +43,7 @@ class _FavPanelState extends State<FavPanel> {
late final list = widget.ctr.favFolderData.value.list!;
return switch (loadingState) {
Loading() => m3eLoading,
Success() => ListView.builder(
Success() => ExtendedListView.builder(
controller: widget.scrollController,
itemCount: list.length,
itemBuilder: (context, index) {

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/button/more_btn.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/follow_order_type.dart';
@@ -58,7 +59,7 @@ class _FollowChildPageState extends State<FollowChildPage>
padding: EdgeInsets.only(left: padding.left, right: padding.right),
child: refreshIndicator(
onRefresh: _followController.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _followController.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -24,7 +25,7 @@ abstract class FollowTypePageState<T extends StatefulWidget> extends State<T> {
appBar: appBar,
body: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
// controller: controller.scrollController,
slivers: [

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
@@ -59,7 +60,7 @@ class _GroupPanelState extends State<GroupPanel> {
tags.isEmpty ? '0' : tags.join(','),
);
if (res.isSuccess) {
SmartDialog.showToast('操作成功');
SmartDialog.showToast('保存成功');
Get.back(result: tags);
} else {
res.toast();
@@ -69,7 +70,7 @@ class _GroupPanelState extends State<GroupPanel> {
Widget get _buildBody {
return switch (loadingState) {
Loading() => m3eLoading,
Success(:final response) => ListView.builder(
Success(:final response) => ExtendedListView.builder(
controller: widget.scrollController,
itemCount: response.length,
itemBuilder: (context, index) {

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/widgets/appbar/appbar.dart';
import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';
import 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
@@ -62,7 +63,7 @@ class _HistoryPageState extends State<HistoryPage>
final padding = MediaQuery.viewPaddingOf(context);
Widget child = refreshIndicator(
onRefresh: _historyController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: _historyController.scrollController,
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';
@@ -60,7 +61,7 @@ class _HotPageState extends State<HotPage>
super.build(context);
return refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: controller.scrollController,
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/later_view_type.dart';
@@ -44,7 +45,7 @@ class _LaterViewChildPageState extends State<LaterViewChildPage>
super.build(context);
return refreshIndicator(
onRefresh: _laterController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: _laterController.scrollController,
slivers: [

View File

@@ -148,7 +148,7 @@ class LaterController extends MultiSelectController<LaterData, LaterItemModel>
Get.find<LaterController>(tag: item.type.toString()).onReload();
} catch (_) {}
}
SmartDialog.showToast('操作成功');
SmartDialog.showToast('已清空');
} else {
res.toast();
}

View File

@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/button/more_btn.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
@@ -55,7 +56,7 @@ class _LivePageState extends State<LivePage>
decoration: const BoxDecoration(borderRadius: Style.mdRadius),
child: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_v.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -47,7 +48,7 @@ class _LiveAreaChildPageState extends State<LiveAreaChildPage>
final ThemeData theme = Theme.of(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_v.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/live/live_follow/item.dart';
@@ -35,7 +36,7 @@ class _LiveFollowPageState extends State<LiveFollowPage> {
),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
@@ -131,7 +132,7 @@ class _ContributionRankTypeState extends State<_ContributionRankType>
type: .transparency,
child: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -393,7 +393,9 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Colors.transparent,
appBar: _buildAppBar(isFullScreen),
appBar: isFullScreen && !isPortrait
? null
: _buildAppBar(isFullScreen),
body: isPortrait
? Obx(
() {
@@ -412,7 +414,9 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Widget _buildPH(bool isFullScreen) {
final height = maxWidth / Style.aspectRatio16x9;
final videoHeight = isFullScreen ? maxHeight - padding.top : height;
final videoHeight = isFullScreen
? maxHeight - (isPortrait ? padding.top : 0)
: height;
final bottomHeight = maxHeight - padding.top - height - kToolbarHeight;
return Column(
children: [
@@ -440,7 +444,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Widget _buildPP(bool isFullScreen) {
final bottomHeight = 70 + padding.bottom;
final videoHeight = isFullScreen
? maxHeight - padding.top
? maxHeight - (isPortrait ? padding.top : 0)
: maxHeight - bottomHeight;
return Stack(
clipBehavior: Clip.none,
@@ -655,7 +659,9 @@ class _LiveRoomPageState extends State<LiveRoomPage>
videoWidth = maxWidth - rightWidth - padding.horizontal;
final videoHeight = maxHeight - padding.top - kToolbarHeight;
final width = isFullScreen ? maxWidth : videoWidth;
final height = isFullScreen ? maxHeight - padding.top : videoHeight;
final height = isFullScreen
? maxHeight - (isPortrait ? padding.top : 0)
: videoHeight;
return Padding(
padding: isFullScreen
? EdgeInsets.zero

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/skeleton/video_card_v.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/live/live_search_type.dart';
@@ -37,7 +38,7 @@ class _LiveSearchChildPageState extends State<LiveSearchChildPage>
double padding = widget.searchType == LiveSearchType.room ? 12 : 0;
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -22,7 +23,7 @@ class _LogPageState<T> extends State<LogPage<T>> {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(title: Text(_controller.title)),
body: CustomScrollView(
body: customScrollView(
slivers: [
SliverPadding(
padding: EdgeInsets.only(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -27,7 +28,7 @@ class LoginDevicesPageState extends State<LoginDevicesPage> {
appBar: AppBar(title: const Text('登录设备')),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
ViewSliverSafeArea(

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_reply.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
@@ -77,7 +78,7 @@ class _MainReplyPageState extends State<MainReplyPage>
left: padding.left,
right: padding.right,
),
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
buildReplyHeader(colorScheme),

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
@@ -47,7 +48,7 @@ class _MatchInfoPageState extends CommonDynPageState<MatchInfoPage> {
body: ViewSafeArea(
child: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
import 'package:PiliPlus/models_new/live/live_medal_wall/data.dart';
@@ -22,7 +23,7 @@ class MedalWall extends StatelessWidget {
title: const Text('粉丝勋章墙'),
contentPadding: const .symmetric(vertical: 16),
constraints: const BoxConstraints.tightFor(width: 380),
content: CustomScrollView(
content: customScrollView(
shrinkWrap: true,
slivers: [
SliverToBoxAdapter(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_article/item.dart';
@@ -43,7 +44,7 @@ class _MemberArticleState extends State<MemberArticle>
super.build(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';
@@ -44,7 +45,7 @@ class _MemberAudioState extends State<MemberAudio>
final colorScheme = ColorScheme.of(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_cheese/item.dart';
@@ -40,7 +41,7 @@ class _MemberCheeseState extends State<MemberCheese>
super.build(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_v.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';
@@ -51,7 +52,7 @@ class _MemberCoinArcPageState extends State<MemberCoinArcPage> {
),
body: refreshIndicator(
onRefresh: _ctr.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_archive/item.dart';
@@ -40,7 +41,7 @@ class _MemberComicState extends State<MemberComic>
super.build(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
@@ -61,7 +62,7 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage>
Widget _buildBody(EdgeInsets padding) => refreshIndicator(
onRefresh: _memberDynamicController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/skeleton/video_card_h.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -46,7 +47,7 @@ class _MemberFavoriteState extends State<MemberFavorite>
final theme = Theme.of(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: _FavScrollPhysics(controller: _controller),
slivers: [
SliverPadding(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
@@ -60,7 +61,7 @@ class _MemberGuardState extends State<MemberGuard> {
),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
slivers: [
ViewSliverSafeArea(
sliver: Obx(() => _buildBody(_controller.loadingState.value)),

View File

@@ -2,6 +2,7 @@ import 'dart:math';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/button/more_btn.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space/data.dart';
@@ -76,7 +77,7 @@ class _MemberHomeState extends State<MemberHome>
Loading() => m3eLoading,
Success(response: final res) =>
res != null
? CustomScrollView(
? customScrollView(
slivers: [
if (res.archive?.item?.isNotEmpty == true) ...[
_header(

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_v.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';
@@ -51,7 +52,7 @@ class _MemberLikeArcPageState extends State<MemberLikeArcPage> {
),
body: refreshIndicator(
onRefresh: _ctr.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/space_opus.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_opus/item.dart';
@@ -53,7 +54,7 @@ class _MemberOpusState extends State<MemberOpus>
children: [
refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_archive/item.dart';
@@ -47,7 +48,7 @@ class _MemberBangumiState extends State<MemberBangumi>
super.build(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,6 +1,7 @@
import 'dart:io' show File;
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/constants.dart';
@@ -128,7 +129,7 @@ class _EditProfilePageState extends State<EditProfilePage> {
return switch (loadingState) {
Loading() => m3eLoading,
Success(:final response) => ListView(
Success(:final response) => listView(
padding: EdgeInsets.only(
bottom: MediaQuery.viewPaddingOf(context).bottom + 25,
),

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -36,7 +37,7 @@ class _MemberSearchChildPageState extends State<MemberSearchChildPage>
super.build(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -44,7 +45,7 @@ class _SeasonSeriesPageState extends State<SeasonSeriesPage>
@override
Widget build(BuildContext context) {
super.build(context);
return CustomScrollView(
return customScrollView(
slivers: [
SliverPadding(
padding: EdgeInsets.only(

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/space_opus.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/space/space_shop/item.dart';
@@ -45,7 +46,7 @@ class _MemberShopState extends State<MemberShop>
super.build(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
@@ -72,7 +73,7 @@ class _UpowerRankPageState extends State<UpowerRankPage>
final padding = MediaQuery.viewPaddingOf(context);
final child = refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';
@@ -99,7 +100,7 @@ class _MemberVideoState extends State<MemberVideo>
}
}
},
child: CustomScrollView(
child: customScrollView(
physics: ReloadScrollPhysics(controller: _controller),
slivers: [
SliverPadding(

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';
@@ -63,7 +64,7 @@ abstract class BaseVideoWebState<
),
body: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: ReloadScrollPhysics(controller: controller),
slivers: [
SliverPadding(

View File

@@ -4,6 +4,7 @@ import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/nav_bar_config.dart';
@@ -78,7 +79,7 @@ class _MediaPageState extends CommonPageState<MinePage>
child: refreshIndicator(
onRefresh: controller.onRefresh,
child: onBuild(
ListView(
listView(
padding: const .only(bottom: 100),
physics: const AlwaysScrollableScrollPhysics(),
children: [

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'
@@ -52,7 +53,7 @@ class _AtMePageState extends State<AtMePage> {
),
body: refreshIndicator(
onRefresh: _atMeController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -34,7 +35,7 @@ class _LikeDetailPageState extends State<LikeDetailPage> {
appBar: AppBar(title: const Text('点赞详情')),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -92,7 +92,7 @@ class LikeMeController
if (res.isSuccess) {
item.noticeState = noticeState;
loadingState.refresh();
SmartDialog.showToast('操作成功');
SmartDialog.showToast('设置成功');
} else {
res.toast();
}

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
@@ -53,7 +54,7 @@ class _LikeMePageState extends State<LikeMePage> {
),
body: refreshIndicator(
onRefresh: _likeMeController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'
@@ -52,7 +53,7 @@ class _ReplyMePageState extends State<ReplyMePage> {
),
body: refreshIndicator(
onRefresh: _replyMeController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/msg_feed_sys_msg_.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -37,7 +38,7 @@ class _SysMsgPageState extends State<SysMsgPage> {
appBar: AppBar(title: const Text('系统通知')),
body: refreshIndicator(
onRefresh: _sysMsgController.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -33,7 +34,7 @@ class _MusicRecommendPageState extends State<MusicRecommendPage>
color: theme.colorScheme.surface,
child: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
_buildAppBar(theme, padding),

View File

@@ -4,6 +4,7 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image_viewer/hero.dart';
import 'package:PiliPlus/common/widgets/marquee.dart';
@@ -114,7 +115,7 @@ class _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {
if (isPortrait) {
child = Padding(
padding: EdgeInsets.symmetric(horizontal: padding),
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
@@ -140,7 +141,7 @@ class _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {
children: [
Expanded(
flex: flex,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
@@ -173,7 +174,7 @@ class _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {
resizeToAvoidBottomInset: false,
body: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/dialog/export_import.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
@@ -76,7 +77,7 @@ class _MyReplyState extends State<MyReply> with DynMixin {
const SizedBox(width: 6),
],
),
body: CustomScrollView(
body: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
_replies.isNotEmpty

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/button/more_btn.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
@@ -57,7 +58,7 @@ class _PgcPageState extends State<PgcPage> with AutomaticKeepAliveClientMixin {
final ThemeData theme = Theme.of(context);
return refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';
@@ -67,7 +68,7 @@ class _PgcIndexPageState extends State<PgcIndexPage>
if (count == 0) return const SizedBox.shrink();
return Padding(
padding: EdgeInsets.only(left: padding.left, right: padding.right),
child: CustomScrollView(
child: customScrollView(
controller: _ctr.scrollController,
slivers: [
if (widget.indexType != null)

View File

@@ -3,6 +3,7 @@ import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/dialog/dialog.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/flutter/selectable_text/selectable_text.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
@@ -67,7 +68,7 @@ class _PgcReviewChildPageState extends State<PgcReviewChildPage>
final theme = Theme.of(context);
return refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';
import 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';
@@ -29,7 +30,7 @@ class _PopularPreciousPageState extends State<PopularPreciousPage>
appBar: AppBar(title: const Text('入站必刷')),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
ViewSliverSafeArea(

View File

@@ -1,6 +1,7 @@
import 'dart:math';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';
@@ -41,7 +42,7 @@ class _PopularSeriesPageState extends State<PopularSeriesPage> with GridMixin {
),
body: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
physics: ReloadScrollPhysics(controller: _controller),
slivers: [
ViewSliverSafeArea(

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -40,7 +41,7 @@ class _ZonePageState extends State<ZonePage>
super.build(context);
return refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_v.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/video_card/video_card_v.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -34,7 +35,7 @@ class _RcmdPageState extends State<RcmdPage>
decoration: const BoxDecoration(borderRadius: Style.mdRadius),
child: refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:PiliPlus/common/widgets/dialog/export_import.dart';
import 'package:PiliPlus/common/widgets/disabled_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/sliver_wrap.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -61,7 +62,7 @@ class _SearchPageState extends State<SearchPage> {
appBar: _buildAppBar,
body: Padding(
padding: .only(left: padding.left, right: padding.right),
child: CustomScrollView(
child: customScrollView(
slivers: [
if (_searchController.searchSuggestion) _buildSearchSuggest(),
if (isPortrait) ...[

View File

@@ -4,7 +4,8 @@ import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/num_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:get/get_navigation/src/extension_navigation.dart';
class SearchUserItem extends StatelessWidget {
const SearchUserItem({

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/search/search_type.dart';
@@ -44,7 +45,7 @@ abstract class CommonSearchPanelState<
final theme = Theme.of(context);
return refreshIndicator(
onRefresh: controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -3,6 +3,7 @@ import 'dart:math';
import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -118,7 +119,7 @@ class _SearchTrendingPageState extends State<SearchTrendingPage> {
width: width,
child: refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/pages/setting/models/extra_settings.dart';
import 'package:flutter/material.dart';
@@ -20,7 +21,7 @@ class _ExtraSettingState extends State<ExtraSetting> {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: showAppBar ? AppBar(title: const Text('其它设置')) : null,
body: ListView.builder(
body: ExtendedListView.builder(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,

View File

@@ -1,6 +1,7 @@
import 'dart:io' show Platform;
import 'package:PiliPlus/common/widgets/color_palette.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/main.dart' show MyApp;
import 'package:PiliPlus/models/common/nav_bar_config.dart';
import 'package:PiliPlus/models/common/theme/theme_color_type.dart';
@@ -67,7 +68,7 @@ class _ColorSelectPageState extends State<ColorSelectPage> {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(title: const Text('选择应用主题')),
body: ListView(
body: listView(
children: [
ListTile(
onTap: () async {

Some files were not shown because too many files have changed in this diff Show More