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/image_save.dart';
import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart'; import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.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/common/widgets/stat/stat.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/http/video.dart';

View File

@@ -52,3 +52,35 @@ class CustomTabBarViewClampingScrollPhysics extends ClampingScrollPhysics {
damping: GStorage.springDescription[2], 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 '../../utils/grid.dart';
import 'controller.dart'; import 'controller.dart';
import 'widgets/bangumi_card_v.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 { class BangumiPage extends StatefulWidget {
const BangumiPage({ const BangumiPage({

View File

@@ -7,7 +7,7 @@ import 'package:PiliPlus/utils/storage.dart';
import '../../http/danmaku_block.dart'; import '../../http/danmaku_block.dart';
import '../../models/user/danmaku_block.dart'; import '../../models/user/danmaku_block.dart';
import '../../plugin/pl_player/controller.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 { class DanmakuBlockPage extends StatefulWidget {
const DanmakuBlockPage({super.key}); 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 'controller.dart';
import 'widgets/up_panel.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 } enum ReplyOption { allow, close, choose }

View File

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

View File

@@ -5,7 +5,7 @@ import 'package:get/get.dart';
import 'controller.dart'; import 'controller.dart';
import 'widgets/follow_list.dart'; import 'widgets/follow_list.dart';
import 'widgets/owner_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 { class FollowPage extends StatefulWidget {
const FollowPage({super.key}); 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:PiliPlus/utils/feed_back.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import './controller.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'; import 'package:stream_transform/stream_transform.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {

View File

@@ -1,7 +1,7 @@
import 'dart:ui'; import 'dart:ui';
import 'package:PiliPlus/common/constants.dart'; 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:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.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/custom_sliver_persistent_header_delegate.dart';
import 'package:PiliPlus/common/widgets/loading_widget.dart'; import 'package:PiliPlus/common/widgets/loading_widget.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/video_card_h_member_video.dart'; import 'package:PiliPlus/common/widgets/video_card_h_member_video.dart';
import 'package:PiliPlus/http/loading_state.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/content/video/member_video_ctr.dart';
import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart' import 'package:PiliPlus/pages/member/new/content/member_contribute/member_contribute.dart'
show ContributeType; show ContributeType;
@@ -70,6 +72,7 @@ class _MemberVideoState extends State<MemberVideo>
await _controller.onRefresh(); await _controller.onRefresh();
}, },
child: CustomScrollView( child: CustomScrollView(
physics: const PositionRetainedScrollPhysics(),
slivers: [ slivers: [
SliverPersistentHeader( SliverPersistentHeader(
pinned: false, pinned: false,
@@ -183,8 +186,10 @@ class _MemberVideoState extends State<MemberVideo>
index == loadingState.response.length - 1) { index == loadingState.response.length - 1) {
_controller.onLoadMore(); _controller.onLoadMore();
} }
final Item item = loadingState.response[index];
return VideoCardHMemberVideo( return VideoCardHMemberVideo(
videoItem: loadingState.response[index], key: ValueKey('${item.param}'),
videoItem: item,
fromViewAid: _controller.fromViewAid, 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:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.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 { class MemberPageNew extends StatefulWidget {
const MemberPageNew({super.key}); 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:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'controller.dart'; import 'controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class MemberSearchPage extends StatefulWidget { class MemberSearchPage extends StatefulWidget {
const MemberSearchPage({super.key}); 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/models/common/search_type.dart';
import 'package:PiliPlus/pages/search_panel/index.dart'; import 'package:PiliPlus/pages/search_panel/index.dart';
import 'controller.dart'; import 'controller.dart';
import 'package:PiliPlus/common/widgets/spring_physics.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart';
class SearchResultPage extends StatefulWidget { class SearchResultPage extends StatefulWidget {
const SearchResultPage({super.key}); const SearchResultPage({super.key});

View File

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

View File

@@ -51,7 +51,7 @@ import 'package:screen_brightness/screen_brightness.dart';
import '../../../services/shutdown_timer_service.dart'; import '../../../services/shutdown_timer_service.dart';
import 'widgets/header_control.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 { class VideoDetailPageV extends StatefulWidget {
const VideoDetailPageV({super.key}); 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/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';
@@ -126,7 +127,7 @@ 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 AlwaysScrollableScrollPhysics(), physics: const PositionRetainedScrollPhysics(),
itemCount: widget.mediaList.length, itemCount: widget.mediaList.length,
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 7, top: 7,
@@ -140,6 +141,7 @@ class _MediaListPanelState
widget.loadMoreMedia(); widget.loadMoreMedia();
} }
return SizedBox( return SizedBox(
key: ValueKey('${item.aid}'),
height: 98, height: 98,
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {