diff --git a/lib/common/widgets/loading_widget.dart b/lib/common/widgets/loading_widget.dart index 4ce18970e..0174f0eab 100644 --- a/lib/common/widgets/loading_widget.dart +++ b/lib/common/widgets/loading_widget.dart @@ -10,7 +10,6 @@ Widget errorWidget({errMsg, callback}) => HttpError( ); Widget scrollErrorWidget({errMsg, callback}) => CustomScrollView( - controller: ScrollController(), slivers: [ HttpError( errMsg: errMsg, diff --git a/lib/common/widgets/scroll_physics.dart b/lib/common/widgets/scroll_physics.dart index 0c3e8e2ed..efc8dd5a2 100644 --- a/lib/common/widgets/scroll_physics.dart +++ b/lib/common/widgets/scroll_physics.dart @@ -54,7 +54,9 @@ class CustomTabBarViewClampingScrollPhysics extends ClampingScrollPhysics { } class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics { - const PositionRetainedScrollPhysics({super.parent}); + const PositionRetainedScrollPhysics({super.parent, this.shouldRetain = true}); + + final bool shouldRetain; @override PositionRetainedScrollPhysics applyTo(ScrollPhysics? ancestor) { @@ -75,9 +77,9 @@ class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics { velocity: velocity, ); - final diff = newPosition.maxScrollExtent - oldPosition.maxScrollExtent; + late final diff = newPosition.maxScrollExtent - oldPosition.maxScrollExtent; - if (oldPosition.pixels == 0 && diff > 0) { + if (shouldRetain && oldPosition.pixels == 0 && diff > 0) { return position + diff; } else { return position; diff --git a/lib/pages/member/new/content/member_contribute/content/video/member_video.dart b/lib/pages/member/new/content/member_contribute/content/video/member_video.dart index e279436f4..28aa91f89 100644 --- a/lib/pages/member/new/content/member_contribute/content/video/member_video.dart +++ b/lib/pages/member/new/content/member_contribute/content/video/member_video.dart @@ -72,7 +72,10 @@ class _MemberVideoState extends State await _controller.onRefresh(); }, child: CustomScrollView( - physics: const PositionRetainedScrollPhysics(), + physics: PositionRetainedScrollPhysics( + shouldRetain: _controller.isLocating == true, + parent: ClampingScrollPhysics(), + ), slivers: [ SliverPersistentHeader( pinned: false, diff --git a/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart b/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart index 3b6b941f0..9e7685b82 100644 --- a/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart +++ b/lib/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart @@ -212,4 +212,10 @@ class MemberVideoCtr extends CommonController { } } } + + @override + Future onReload() { + isLocating = null; + return super.onReload(); + } } diff --git a/lib/pages/video/detail/member/horizontal_member_page.dart b/lib/pages/video/detail/member/horizontal_member_page.dart index f11c9bb6c..312a3a1f0 100644 --- a/lib/pages/video/detail/member/horizontal_member_page.dart +++ b/lib/pages/video/detail/member/horizontal_member_page.dart @@ -180,7 +180,10 @@ class _HorizontalMemberPageState extends State { color: Colors.transparent, child: CustomScrollView( controller: _controller.scrollController, - physics: const PositionRetainedScrollPhysics(), + physics: PositionRetainedScrollPhysics( + shouldRetain: _controller.hasPrev, + parent: ClampingScrollPhysics(), + ), slivers: [ _buildSliverHeader, SliverPadding( diff --git a/lib/pages/video/detail/note/note_list_page.dart b/lib/pages/video/detail/note/note_list_page.dart index 4b6ec25e8..b825e5053 100644 --- a/lib/pages/video/detail/note/note_list_page.dart +++ b/lib/pages/video/detail/note/note_list_page.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/common/skeleton/video_reply.dart'; +import 'package:PiliPlus/common/widgets/http_error.dart'; import 'package:PiliPlus/common/widgets/icon_button.dart'; -import 'package:PiliPlus/common/widgets/loading_widget.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; @@ -173,16 +173,21 @@ class _NoteListPageState extends CommonSlidePageState { ], ), ) - : scrollErrorWidget( - callback: _controller.onReload, - ), - Error() => scrollErrorWidget( - errMsg: loadingState.errMsg, - callback: _controller.onReload, - ), + : errWidget(), + Error() => errWidget(loadingState.errMsg), LoadingState() => throw UnimplementedError(), }; } + + Widget errWidget([errMsg]) => CustomScrollView( + controller: _controller.scrollController, + slivers: [ + HttpError( + errMsg: errMsg, + callback: _controller.onReload, + ) + ], + ); } Widget _itemWidget(BuildContext context, dynamic item) { diff --git a/lib/pages/video/detail/widgets/media_list_panel.dart b/lib/pages/video/detail/widgets/media_list_panel.dart index 62ebb58c7..5a93496e6 100644 --- a/lib/pages/video/detail/widgets/media_list_panel.dart +++ b/lib/pages/video/detail/widgets/media_list_panel.dart @@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/dialog.dart'; import 'package:PiliPlus/common/widgets/icon_button.dart'; import 'package:PiliPlus/common/widgets/image_save.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; -import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:flutter/material.dart'; @@ -127,7 +126,9 @@ class _MediaListPanelState widget.onDelete != null && widget.mediaList.length > 1; return ScrollablePositionedList.separated( itemScrollController: _scrollController, - physics: const PositionRetainedScrollPhysics(), + // physics: const PositionRetainedScrollPhysics( + // parent: ClampingScrollPhysics(), + // ), itemCount: widget.mediaList.length, padding: EdgeInsets.only( top: 7,