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

@@ -1,3 +1,4 @@
import 'package:PiliPlus/common/widgets/flutter/scroll_view/scroll_view.dart';
import 'package:PiliPlus/common/widgets/flutter/selectable_text/text.dart';
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart';
@@ -26,7 +27,7 @@ class AiConclusionPanel extends CommonSlidePage {
Key? key,
bool tap = true,
}) {
return CustomScrollView(
return customScrollView(
key: key,
shrinkWrap: !tap,
physics: const AlwaysScrollableScrollPhysics(),

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/badge.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/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/stat/stat.dart';
import 'package:PiliPlus/models/common/badge_type.dart';
@@ -175,7 +176,7 @@ class _DownloadPanelState extends State<DownloadPanel> {
return Expanded(
child: Material(
type: MaterialType.transparency,
child: CustomScrollView(
child: customScrollView(
controller: widget.scrollController,
slivers: [
SliverPadding(

View File

@@ -1,4 +1,5 @@
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/flutter/selectable_text/text.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
@@ -117,7 +118,7 @@ class _IntroDetailState extends State<PgcIntroPanel>
final TextStyle textStyle = TextStyle(
color: theme.colorScheme.onSurfaceVariant,
);
return ListView(
return listView(
controller: _controller,
physics: const AlwaysScrollableScrollPhysics(),
padding: EdgeInsets.only(

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/widgets/badge.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/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/stat/stat.dart';
@@ -120,7 +121,7 @@ class _MediaListPanelState extends State<MediaListPanel>
Widget _buildList(ThemeData theme) {
final showDelBtn = widget.onDelete != null && widget.mediaList.length > 1;
return CustomScrollView(
return customScrollView(
controller: _controller,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/common/skeleton/video_card_h.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/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';
@@ -89,7 +90,7 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
Expanded(
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/skeleton/video_reply.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';
@@ -109,7 +110,7 @@ class _NoteListPageState extends State<NoteListPage>
Widget buildList(ThemeData theme) {
Widget child = refreshIndicator(
onRefresh: _controller.onRefresh,
child: CustomScrollView(
child: customScrollView(
key: _key,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math';
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/http_error.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -252,7 +253,7 @@ class _PostPanelState extends State<PostPanel>
return const HttpError(isSliver: false);
}
final bottom = MediaQuery.viewPaddingOf(context).bottom;
Widget child = ListView.builder(
Widget child = ExtendedListView.builder(
key: _key,
physics: const AlwaysScrollableScrollPhysics(),
padding: EdgeInsets.only(bottom: 88 + bottom),

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/grpc/bilibili/main/community/reply/v1.pb.dart'
@@ -82,7 +83,7 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
child: Stack(
clipBehavior: Clip.none,
children: [
CustomScrollView(
customScrollView(
controller: widget.isNested
? null
: _videoReplyController.scrollController,

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/skeleton/video_reply.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/colored_box_transition.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/common/widgets/view_safe_area.dart';
@@ -186,7 +187,7 @@ class _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel>
final child = refreshIndicator(
onRefresh: _controller.onRefresh,
isClampingScrollPhysics: widget.isNested,
child: CustomScrollView(
child: customScrollView(
key: ValueKey(scrollController.hashCode),
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),

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/grpc/bilibili/main/community/reply/v1.pb.dart'
show SearchItem;
@@ -33,7 +34,7 @@ class _ReplySearchChildPageState extends State<ReplySearchChildPage>
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 'dart:async';
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/view_safe_area.dart';
import 'package:PiliPlus/http/danmaku.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -179,7 +180,7 @@ class _SendDanmakuPanelState extends CommonTextPubPageState<SendDanmakuPanel> {
),
),
),
child: ListView(
child: listView(
physics: const ClampingScrollPhysics(),
padding: .only(
top: 12,

View File

@@ -7,6 +7,7 @@ import 'package:PiliPlus/common/assets.dart';
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/custom_icon.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/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/route_aware_mixin.dart';
@@ -1017,7 +1018,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
localIntroPanel()
else if (showIntro)
KeepAliveWrapper(
child: CustomScrollView(
child: customScrollView(
key: const PageStorageKey(CommonIntroController),
controller:
videoDetailController.effectiveIntroScrollCtr,
@@ -1676,7 +1677,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
Widget localIntroPanel({
bool needCtr = true,
}) {
return CustomScrollView(
return customScrollView(
controller: needCtr
? videoDetailController.effectiveIntroScrollCtr
: null,
@@ -1708,7 +1709,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
return localIntroPanel(needCtr: needCtr);
}
Widget introPanel() {
Widget child = CustomScrollView(
Widget child = customScrollView(
key: const PageStorageKey(CommonIntroController),
controller: needCtr
? videoDetailController.effectiveIntroScrollCtr

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/style.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/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';
import 'package:PiliPlus/pages/common/slide/common_slide_page.dart';
@@ -91,7 +92,7 @@ class _ViewPointsPageState extends State<ViewPointsPage>
@override
Widget buildList(ThemeData theme) {
final child = ListView.builder(
final child = ExtendedListView.builder(
key: _key,
physics: const AlwaysScrollableScrollPhysics(),
padding: EdgeInsets.only(