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(
controller: ScrollController(),
slivers: [
HttpError(
errMsg: errMsg,

View File

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

View File

@@ -72,7 +72,10 @@ class _MemberVideoState extends State<MemberVideo>
await _controller.onRefresh();
},
child: CustomScrollView(
physics: const PositionRetainedScrollPhysics(),
physics: PositionRetainedScrollPhysics(
shouldRetain: _controller.isLocating == true,
parent: ClampingScrollPhysics(),
),
slivers: [
SliverPersistentHeader(
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,
child: CustomScrollView(
controller: _controller.scrollController,
physics: const PositionRetainedScrollPhysics(),
physics: PositionRetainedScrollPhysics(
shouldRetain: _controller.hasPrev,
parent: ClampingScrollPhysics(),
),
slivers: [
_buildSliverHeader,
SliverPadding(

View File

@@ -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<NoteListPage> {
],
),
)
: 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) {

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/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,