opt: load previous data

Closes #597

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-04 15:26:22 +08:00
parent f5c2bd47d5
commit 9a7d73cb6b
16 changed files with 58 additions and 17 deletions

View File

@@ -6,7 +6,7 @@ import 'package:PiliPlus/common/widgets/icon_button.dart';
import 'package:PiliPlus/common/widgets/image_save.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/stat/stat.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/video.dart';

View File

@@ -52,3 +52,35 @@ class CustomTabBarViewClampingScrollPhysics extends ClampingScrollPhysics {
damping: GStorage.springDescription[2],
);
}
class PositionRetainedScrollPhysics extends AlwaysScrollableScrollPhysics {
const PositionRetainedScrollPhysics({super.parent});
@override
PositionRetainedScrollPhysics applyTo(ScrollPhysics? ancestor) {
return PositionRetainedScrollPhysics(parent: buildParent(ancestor));
}
@override
double adjustPositionForNewDimensions({
required ScrollMetrics oldPosition,
required ScrollMetrics newPosition,
required bool isScrolling,
required double velocity,
}) {
final position = super.adjustPositionForNewDimensions(
oldPosition: oldPosition,
newPosition: newPosition,
isScrolling: isScrolling,
velocity: velocity,
);
final diff = newPosition.maxScrollExtent - oldPosition.maxScrollExtent;
if (oldPosition.pixels >= oldPosition.minScrollExtent && diff > 0) {
return position + diff;
} else {
return position;
}
}
}

View File

@@ -16,7 +16,7 @@ import 'package:PiliPlus/pages/main/index.dart';
import '../../utils/grid.dart';
import 'controller.dart';
import 'widgets/bangumi_card_v.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class BangumiPage extends StatefulWidget {
const BangumiPage({

View File

@@ -7,7 +7,7 @@ import 'package:PiliPlus/utils/storage.dart';
import '../../http/danmaku_block.dart';
import '../../models/user/danmaku_block.dart';
import '../../plugin/pl_player/controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class DanmakuBlockPage extends StatefulWidget {
const DanmakuBlockPage({super.key});

View File

@@ -11,7 +11,7 @@ import 'package:material_design_icons_flutter/material_design_icons_flutter.dart
import 'controller.dart';
import 'widgets/up_panel.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
enum ReplyOption { allow, close, choose }

View File

@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../common/widgets/network_img_layer.dart';
import 'controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class EmotePanel extends StatefulWidget {
final Function onChoose;

View File

@@ -5,7 +5,7 @@ import 'package:get/get.dart';
import 'controller.dart';
import 'widgets/follow_list.dart';
import 'widgets/owner_follow_list.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class FollowPage extends StatefulWidget {
const FollowPage({super.key});

View File

@@ -8,7 +8,7 @@ import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import './controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:stream_transform/stream_transform.dart';
class HomePage extends StatefulWidget {

View File

@@ -1,7 +1,7 @@
import 'dart:ui';
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

View File

@@ -2,8 +2,10 @@ import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/custom_sliver_persistent_header_delegate.dart';
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/video_card_h_member_video.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/space_archive/item.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/content/video/member_video_ctr.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType;
@@ -70,6 +72,7 @@ class _MemberVideoState extends State<MemberVideo>
await _controller.onRefresh();
},
child: CustomScrollView(
physics: const PositionRetainedScrollPhysics(),
slivers: [
SliverPersistentHeader(
pinned: false,
@@ -183,8 +186,10 @@ class _MemberVideoState extends State<MemberVideo>
index == loadingState.response.length - 1) {
_controller.onLoadMore();
}
final Item item = loadingState.response[index];
return VideoCardHMemberVideo(
videoItem: loadingState.response[index],
key: ValueKey('${item.param}'),
videoItem: item,
fromViewAid: _controller.fromViewAid,
);
},

View File

@@ -15,7 +15,7 @@ import 'package:PiliPlus/utils/utils.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class MemberPageNew extends StatefulWidget {
const MemberPageNew({super.key});

View File

@@ -3,7 +3,7 @@ import 'package:PiliPlus/pages/member_search/search_dynamic.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class MemberSearchPage extends StatefulWidget {
const MemberSearchPage({super.key});

View File

@@ -5,7 +5,7 @@ import 'package:get/get.dart';
import 'package:PiliPlus/models/common/search_type.dart';
import 'package:PiliPlus/pages/search_panel/index.dart';
import 'controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class SearchResultPage extends StatefulWidget {
const SearchResultPage({super.key});

View File

@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactivevie
show SourceModel;
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/common/widgets/video_card_h_member_video.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/member/info.dart';
@@ -179,7 +180,7 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
color: Colors.transparent,
child: CustomScrollView(
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
physics: const PositionRetainedScrollPhysics(),
slivers: [
_buildSliverHeader,
SliverPadding(
@@ -198,11 +199,12 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
_controller.hasNext) {
_controller.onLoadMore();
}
final Item videoItem = loadingState.response[index];
return VideoCardHMemberVideo(
videoItem: loadingState.response[index],
key: ValueKey('${videoItem.param}'),
videoItem: videoItem,
bvid: _bvid,
onTap: () {
final Item videoItem = loadingState.response[index];
final status =
widget.videoIntroController.changeSeasonOrbangu(
null,

View File

@@ -51,7 +51,7 @@ import 'package:screen_brightness/screen_brightness.dart';
import '../../../services/shutdown_timer_service.dart';
import 'widgets/header_control.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class VideoDetailPageV extends StatefulWidget {
const VideoDetailPageV({super.key});

View File

@@ -2,6 +2,7 @@ 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';
@@ -126,7 +127,7 @@ class _MediaListPanelState
widget.onDelete != null && widget.mediaList.length > 1;
return ScrollablePositionedList.separated(
itemScrollController: _scrollController,
physics: const AlwaysScrollableScrollPhysics(),
physics: const PositionRetainedScrollPhysics(),
itemCount: widget.mediaList.length,
padding: EdgeInsets.only(
top: 7,
@@ -140,6 +141,7 @@ class _MediaListPanelState
widget.loadMoreMedia();
}
return SizedBox(
key: ValueKey('${item.aid}'),
height: 98,
child: InkWell(
onTap: () async {