* opt: cache

* opt: MediaListPanel

* feat: nested replyreply panel

* tweaks

* opt: abstract class

* opt: PageStorageKey

* opt: contextExt

* opt: EpisodePanel

* opt

* opt: context instead GlobalKey

* feat: jump to reply

* refa: reply_reply

* fix: jump

* fix: index

* update

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* opt: keepalive

* reapply: nested replyreply

* mod: spacing

* opt: CommonSlidePageState

* fix drag bottomsheet

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* opt reply jump

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* opt reply2reply

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* tweaks

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* tweaks

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* reapply: jumpToReply

* fix: padding

* fix: anim

* fix some panels

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

* opt: implements Scaffold

* opt: remove keepalive

* revert: GlobalKey

* tweaks

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>

---------

Co-authored-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
My-Responsitories
2025-09-15 18:45:28 +08:00
committed by GitHub
parent b9a55ccbce
commit 37fb63c3b1
75 changed files with 6300 additions and 1140 deletions

View File

@@ -22,7 +22,6 @@ import 'package:PiliPlus/models_new/video/video_detail/section.dart';
import 'package:PiliPlus/models_new/video/video_detail/staff.dart';
import 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';
import 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart';
import 'package:PiliPlus/models_new/video/video_relation/data.dart';
import 'package:PiliPlus/pages/common/common_intro_controller.dart';
import 'package:PiliPlus/pages/dynamics_repost/view.dart';
import 'package:PiliPlus/pages/video/controller.dart';
@@ -166,19 +165,18 @@ class UgcIntroController extends CommonIntroController with ReloadMixin {
Future<void> queryAllStatus() async {
var result = await VideoHttp.videoRelation(bvid: bvid);
if (result['status']) {
VideoRelation data = result['data'];
if (result case Success(:var response)) {
late final stat = videoDetail.value.stat!;
if (data.like!) {
if (response.like!) {
stat.like = max(1, stat.like);
}
if (data.favorite!) {
if (response.favorite!) {
stat.favorite = max(1, stat.favorite);
}
hasLike.value = data.like!;
hasDislike.value = data.dislike!;
coinNum.value = data.coin!;
hasFav.value = data.favorite!;
hasLike.value = response.like!;
hasDislike.value = response.dislike!;
coinNum.value = response.coin!;
hasFav.value = response.favorite!;
}
}

View File

@@ -54,22 +54,23 @@ class UgcIntroPanel extends StatefulWidget {
State<UgcIntroPanel> createState() => _UgcIntroPanelState();
}
class _UgcIntroPanelState extends TripleState<UgcIntroPanel>
with AutomaticKeepAliveClientMixin {
class _UgcIntroPanelState extends TripleState<UgcIntroPanel> {
@override
late UgcIntroController introController;
late final UgcIntroController introController;
late final VideoDetailController videoDetailCtr =
Get.find<VideoDetailController>(tag: widget.heroTag);
@override
void initState() {
super.initState();
introController = Get.put(UgcIntroController(), tag: widget.heroTag);
introController = Get.putOrFind(
UgcIntroController.new,
tag: widget.heroTag,
);
}
@override
Widget build(BuildContext context) {
super.build(context);
final ThemeData theme = Theme.of(context);
const expandTheme = ExpandableThemeData(
animationDuration: Duration(milliseconds: 300),
@@ -963,7 +964,4 @@ class _UgcIntroPanelState extends TripleState<UgcIntroPanel>
),
);
}
@override
bool get wantKeepAlive => true;
}

View File

@@ -35,8 +35,8 @@ class PagesPanel extends StatefulWidget {
class _PagesPanelState extends State<PagesPanel> {
late int cid;
int pageIndex = -1;
late VideoDetailController _videoDetailController;
final ScrollController _scrollController = ScrollController();
late final VideoDetailController _videoDetailController;
late final ScrollController _scrollController;
StreamSubscription? _listener;
List<Part> get pages =>
@@ -48,28 +48,32 @@ class _PagesPanelState extends State<PagesPanel> {
_videoDetailController = Get.find<VideoDetailController>(
tag: widget.heroTag,
);
double offset = 0;
if (widget.list == null) {
cid = widget.ugcIntroController.cid.value;
pageIndex = pages.indexWhere((Part e) => e.cid == cid);
_listener = _videoDetailController.cid.listen((int cid) {
offset = targetOffset;
_listener = _videoDetailController.cid.listen((cid) {
this.cid = cid;
pageIndex = max(0, pages.indexWhere((Part e) => e.cid == cid));
pageIndex = max(0, pages.indexWhere((e) => e.cid == cid));
if (!mounted) return;
setState(() {});
jumpToCurr();
});
WidgetsBinding.instance.addPostFrameCallback((_) {
jumpToCurr();
});
}
_scrollController = ScrollController(initialScrollOffset: offset);
}
double get targetOffset {
const double itemWidth = 150;
return max(0, pageIndex * itemWidth - itemWidth / 2);
}
void jumpToCurr() {
if (!_scrollController.hasClients || pages.isEmpty) {
return;
}
const double itemWidth = 150;
final double targetOffset = (pageIndex * itemWidth - itemWidth / 2).clamp(
final double targetOffset = this.targetOffset.clamp(
_scrollController.position.minScrollExtent,
_scrollController.position.maxScrollExtent,
);
@@ -136,6 +140,7 @@ class _PagesPanelState extends State<PagesPanel> {
SizedBox(
height: 35,
child: ListView.builder(
key: PageStorageKey(widget.bvid),
controller: _scrollController,
scrollDirection: Axis.horizontal,
itemCount: pages.length,