refa: horizontal member page

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-30 16:20:40 +08:00
parent a904414f3d
commit 9da3a538fb
9 changed files with 310 additions and 118 deletions

View File

@@ -1,27 +1,24 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/custom_sliver_persistent_header_delegate.dart';
import 'package:PiliPlus/common/widgets/icon_button.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'
show SourceModel;
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/video_card_h_member_video.dart';
import 'package:PiliPlus/common/widgets/pair.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/member/info.dart';
import 'package:PiliPlus/pages/video/detail/controller.dart';
import 'package:PiliPlus/pages/video/detail/introduction/controller.dart';
import 'package:PiliPlus/pages/video/detail/member/controller.dart';
import 'package:PiliPlus/pages/video/detail/member/widget/video_card_h_member_video.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import '../../../../models/space_archive/item.dart';
class HorizontalMemberPage extends StatefulWidget {
const HorizontalMemberPage({
super.key,
@@ -42,23 +39,40 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
late final HorizontalMemberPageController _controller;
int? _ownerMid;
dynamic _bvid;
late final String _tag;
@override
void initState() {
super.initState();
_tag = Utils.makeHeroTag(widget.mid);
_controller = Get.put(
HorizontalMemberPageController(mid: widget.mid),
tag: _tag,
HorizontalMemberPageController(
mid: widget.mid,
firstParam: Triple<dynamic, dynamic, dynamic>(
first: widget.videoDetailController.oid.value,
second: widget.videoDetailController.cid.value,
third: 0,
),
),
tag: widget.videoDetailController.heroTag,
);
_bvid = widget.videoDetailController.bvid;
_ownerMid = GStorage.userInfo.get('userInfoCache')?.mid;
if (_controller.hasPrev) {
_controller.scrollController.addListener(listener);
}
}
void listener() {
if (_controller.scrollController.position.pixels == 0) {
if (_controller.hasPrev) {
_controller.isLoadPrevious = true;
_controller.onLoadMore();
}
}
}
@override
void dispose() {
Get.delete<HorizontalMemberPageController>(tag: _tag);
_controller.scrollController.removeListener(listener);
super.dispose();
}
@@ -106,64 +120,15 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
};
}
Widget get _buildSliverHeader {
return SliverPersistentHeader(
pinned: false,
floating: true,
delegate: CustomSliverPersistentHeaderDelegate(
extent: 40,
bgColor: Theme.of(context).colorScheme.surface,
child: Container(
height: 40,
padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Obx(
() => Text(
_controller.count.value != -1
? '${_controller.count.value}视频'
: '',
style: const TextStyle(fontSize: 13),
),
),
SizedBox(
height: 35,
child: TextButton.icon(
onPressed: _controller.queryBySort,
icon: Icon(
Icons.sort,
size: 16,
color: Theme.of(context).colorScheme.secondary,
),
label: Obx(
() => Text(
_controller.order.value == 'pubdate' ? '最新发布' : '最多播放',
style: TextStyle(
fontSize: 13,
color: Theme.of(context).colorScheme.secondary,
),
),
),
),
)
],
),
),
),
);
}
Widget _buildVideoList(LoadingState loadingState) {
return switch (loadingState) {
Loading() => loadingWidget,
Success() => Material(
color: Colors.transparent,
child: CustomScrollView(
controller: ScrollController(),
controller: _controller.scrollController,
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
_buildSliverHeader,
SliverPadding(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).padding.bottom + 80,
@@ -176,23 +141,27 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
),
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.length - 1) {
if (index == loadingState.response.length - 1 &&
_controller.hasNext) {
_controller.onLoadMore();
}
return VideoCardHMemberVideo(
videoItem: loadingState.response[index],
bvid: _bvid,
onTap: () {
final Item videoItem = loadingState.response[index];
widget.videoIntroController.changeSeasonOrbangu(
final videoItem = loadingState.response[index];
final status =
widget.videoIntroController.changeSeasonOrbangu(
null,
videoItem.bvid,
videoItem.cid,
IdUtils.bv2av(videoItem.bvid!),
videoItem.cover,
videoItem['bvid'],
videoItem['player_args']?['cid'],
int.parse(videoItem['param']),
videoItem['cover'],
);
_bvid = videoItem.bvid;
setState(() {});
if (status) {
_bvid = videoItem['bvid'];
setState(() {});
}
},
);
},
@@ -203,7 +172,7 @@ class _HorizontalMemberPageState extends State<HorizontalMemberPage> {
],
),
),
Error() => errorWidget(
Error() => scrollErrorWidget(
errMsg: loadingState.errMsg,
callback: _controller.onReload,
),