mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-01 08:38:18 +08:00
opt: load previous data
Closes #597 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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';
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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({
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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});
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user