opt scroll view

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-04-14 09:21:06 +08:00
parent 4de43faa2e
commit f9441db232
121 changed files with 4536 additions and 126 deletions

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

@@ -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

@@ -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

@@ -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';
@@ -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

@@ -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

@@ -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

@@ -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

@@ -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 {

View File

@@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:PiliPlus/common/constants.dart';
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/loading_widget/loading_widget.dart';
import 'package:PiliPlus/services/logger.dart';
import 'package:PiliPlus/utils/date_utils.dart';
@@ -163,7 +164,7 @@ class _LogsPageState extends State<LogsPage> {
left: padding.left + 12,
right: padding.right + 12,
),
child: CustomScrollView(
child: customScrollView(
slivers: [
if (latestLog != null)
SliverToBoxAdapter(

View File

@@ -1,6 +1,7 @@
import 'dart:math';
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/pages/setting/widgets/switch_item.dart';
import 'package:PiliPlus/utils/extension/context_ext.dart';
@@ -200,7 +201,7 @@ class _PlaySpeedPageState extends State<PlaySpeedPage> {
],
),
body: ViewSafeArea(
child: ListView(
child: listView(
children: [
Padding(
padding: const EdgeInsets.only(

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/pages/setting/models/play_settings.dart';
import 'package:flutter/material.dart';
@@ -20,7 +21,7 @@ class _PlaySettingState extends State<PlaySetting> {
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,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/pages/setting/models/recommend_settings.dart';
import 'package:flutter/material.dart' hide ListTile;
@@ -22,7 +23,7 @@ class _RecommendSettingState extends State<RecommendSetting> {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: widget.showAppBar ? AppBar(title: const Text('推荐流设置')) : null,
body: ListView(
body: listView(
padding: EdgeInsets.only(
left: showAppBar ? padding.left : 0,
right: showAppBar ? padding.right : 0,

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/pages/setting/models/style_settings.dart';
import 'package:flutter/material.dart';
@@ -20,7 +21,7 @@ class _StyleSettingState extends State<StyleSetting> {
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,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/pages/setting/models/video_settings.dart';
import 'package:flutter/material.dart';
@@ -20,7 +21,7 @@ class _VideoSettingState extends State<VideoSetting> {
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,4 +1,5 @@
import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/http/login.dart';
import 'package:PiliPlus/models/common/setting_type.dart';
@@ -170,7 +171,7 @@ class _SettingPageState extends State<SettingPage> {
TextStyle subTitleStyle = theme.textTheme.labelMedium!.copyWith(
color: theme.colorScheme.outline,
);
return ListView(
return listView(
padding: EdgeInsets.only(bottom: padding.bottom + 100),
children: [
_buildSearchItem(theme),

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_sliver_safe_area.dart';
import 'package:PiliPlus/pages/search/controller.dart' show DebounceStreamState;
@@ -88,7 +89,7 @@ class _SettingsSearchPageState
),
),
),
body: CustomScrollView(
body: customScrollView(
slivers: [
ViewSliverSafeArea(
sliver: Obx(

View File

@@ -1,5 +1,6 @@
import 'dart:math';
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_setting/privacy.dart';
@@ -54,7 +55,7 @@ class _SpaceSettingPageState extends State<SpaceSettingPage> {
color: theme.colorScheme.outline.withValues(alpha: 0.1),
),
);
return CustomScrollView(
return customScrollView(
slivers: [
dividerL,
SliverList.separated(

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