opt: load previous

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-04 16:18:18 +08:00
parent cb3e57feec
commit 7fafa88eb7
7 changed files with 35 additions and 16 deletions

View File

@@ -10,7 +10,6 @@ Widget errorWidget({errMsg, callback}) => HttpError(
); );
Widget scrollErrorWidget({errMsg, callback}) => CustomScrollView( Widget scrollErrorWidget({errMsg, callback}) => CustomScrollView(
controller: ScrollController(),
slivers: [ slivers: [
HttpError( HttpError(
errMsg: errMsg, errMsg: errMsg,

View File

@@ -54,7 +54,9 @@ class CustomTabBarViewClampingScrollPhysics extends ClampingScrollPhysics {
} }
class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics { class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics {
const PositionRetainedScrollPhysics({super.parent}); const PositionRetainedScrollPhysics({super.parent, this.shouldRetain = true});
final bool shouldRetain;
@override @override
PositionRetainedScrollPhysics applyTo(ScrollPhysics? ancestor) { PositionRetainedScrollPhysics applyTo(ScrollPhysics? ancestor) {
@@ -75,9 +77,9 @@ class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics {
velocity: velocity, 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; return position + diff;
} else { } else {
return position; return position;

View File

@@ -72,7 +72,10 @@ class _MemberVideoState extends State<MemberVideo>
await _controller.onRefresh(); await _controller.onRefresh();
}, },
child: CustomScrollView( child: CustomScrollView(
physics: const PositionRetainedScrollPhysics(), physics: PositionRetainedScrollPhysics(
shouldRetain: _controller.isLocating == true,
parent: ClampingScrollPhysics(),
),
slivers: [ slivers: [
SliverPersistentHeader( SliverPersistentHeader(
pinned: false, pinned: false,

View File

@@ -212,4 +212,10 @@ class MemberVideoCtr extends CommonController {
} }
} }
} }
@override
Future onReload() {
isLocating = null;
return super.onReload();
}
} }

View File

@@ -180,7 +180,10 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
color: Colors.transparent, color: Colors.transparent,
child: CustomScrollView( child: CustomScrollView(
controller: _controller.scrollController, controller: _controller.scrollController,
physics: const PositionRetainedScrollPhysics(), physics: PositionRetainedScrollPhysics(
shouldRetain: _controller.hasPrev,
parent: ClampingScrollPhysics(),
),
slivers: [ slivers: [
_buildSliverHeader, _buildSliverHeader,
SliverPadding( SliverPadding(

View File

@@ -1,6 +1,6 @@
import 'package:PiliPlus/common/skeleton/video_reply.dart'; 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/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/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
@@ -173,16 +173,21 @@ class _NoteListPageState extends CommonSlidePageState<NoteListPage> {
], ],
), ),
) )
: scrollErrorWidget( : errWidget(),
callback: _controller.onReload, Error() => errWidget(loadingState.errMsg),
),
Error() => scrollErrorWidget(
errMsg: loadingState.errMsg,
callback: _controller.onReload,
),
LoadingState() => throw UnimplementedError(), LoadingState() => throw UnimplementedError(),
}; };
} }
Widget errWidget([errMsg]) => CustomScrollView(
controller: _controller.scrollController,
slivers: [
HttpError(
errMsg: errMsg,
callback: _controller.onReload,
)
],
);
} }
Widget _itemWidget(BuildContext context, dynamic item) { Widget _itemWidget(BuildContext context, dynamic item) {

View File

@@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/dialog.dart';
import 'package:PiliPlus/common/widgets/icon_button.dart'; import 'package:PiliPlus/common/widgets/icon_button.dart';
import 'package:PiliPlus/common/widgets/image_save.dart'; import 'package:PiliPlus/common/widgets/image_save.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.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/common/widgets/stat/stat.dart';
import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -127,7 +126,9 @@ class _MediaListPanelState
widget.onDelete != null && widget.mediaList.length > 1; widget.onDelete != null && widget.mediaList.length > 1;
return ScrollablePositionedList.separated( return ScrollablePositionedList.separated(
itemScrollController: _scrollController, itemScrollController: _scrollController,
physics: const PositionRetainedScrollPhysics(), // physics: const PositionRetainedScrollPhysics(
// parent: ClampingScrollPhysics(),
// ),
itemCount: widget.mediaList.length, itemCount: widget.mediaList.length,
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 7, top: 7,