feat: 查看up主收藏订阅

This commit is contained in:
guozhigq
2024-07-06 15:37:50 +08:00
parent 4db4e1f32b
commit 6f30165079
12 changed files with 115 additions and 48 deletions

View File

@ -16,10 +16,16 @@ class FavController extends GetxController {
int currentPage = 1;
int pageSize = 60;
RxBool hasMore = true.obs;
late int mid;
late int ownerMid;
RxBool isOwner = false.obs;
@override
void onInit() {
mid = int.parse(Get.parameters['mid'] ?? '-1');
userInfo = userInfoCache.get('userInfoCache');
ownerMid = userInfo != null ? userInfo!.mid! : -1;
isOwner.value = mid == -1 || mid == ownerMid;
super.onInit();
}
@ -33,7 +39,7 @@ class FavController extends GetxController {
var res = await UserHttp.userfavFolder(
pn: currentPage,
ps: pageSize,
mid: userInfo!.mid!,
mid: isOwner.value ? ownerMid : mid,
);
if (res['status']) {
if (type == 'init') {

View File

@ -42,17 +42,25 @@ class _FavPageState extends State<FavPage> {
appBar: AppBar(
centerTitle: false,
titleSpacing: 0,
title: Text(
'的收藏',
style: Theme.of(context).textTheme.titleMedium,
),
title: Obx(() => Text(
'${_favController.isOwner.value ? '' : 'Ta'}的收藏',
style: Theme.of(context).textTheme.titleMedium,
)),
actions: [
Obx(() => !_favController.isOwner.value
? IconButton(
onPressed: () =>
Get.toNamed('/subscription?mid=${_favController.mid}'),
icon: const Icon(Icons.subscriptions_outlined, size: 21),
tooltip: 'Ta的订阅',
)
: const SizedBox.shrink()),
IconButton(
onPressed: () => Get.toNamed(
'/favSearch?searchType=1&mediaId=${_favController.favFolderData.value.list!.first.id}'),
icon: const Icon(Icons.search_outlined),
),
const SizedBox(width: 6),
const SizedBox(width: 14),
],
),
body: FutureBuilder(
@ -67,7 +75,9 @@ class _FavPageState extends State<FavPage> {
itemCount: _favController.favFolderList.length,
itemBuilder: (context, index) {
return FavItem(
favFolderItem: _favController.favFolderList[index]);
favFolderItem: _favController.favFolderList[index],
isOwner: _favController.isOwner.value,
);
},
),
);

View File

@ -7,7 +7,9 @@ import 'package:pilipala/utils/utils.dart';
class FavItem extends StatelessWidget {
// ignore: prefer_typing_uninitialized_variables
final favFolderItem;
const FavItem({super.key, required this.favFolderItem});
final bool isOwner;
const FavItem(
{super.key, required this.favFolderItem, required this.isOwner});
@override
Widget build(BuildContext context) {
@ -20,6 +22,7 @@ class FavItem extends StatelessWidget {
parameters: {
'heroTag': heroTag,
'mediaId': favFolderItem.id.toString(),
'isOwner': isOwner ? '1' : '0',
},
);
},

View File

@ -19,6 +19,7 @@ class FavDetailController extends GetxController {
RxList favList = [].obs;
RxString loadingText = '加载中...'.obs;
RxInt mediaCount = 0.obs;
late String isOwner;
@override
void onInit() {
@ -26,6 +27,7 @@ class FavDetailController extends GetxController {
if (Get.parameters.keys.isNotEmpty) {
mediaId = int.parse(Get.parameters['mediaId']!);
heroTag = Get.parameters['heroTag']!;
isOwner = Get.parameters['isOwner']!;
}
super.onInit();
}

View File

@ -212,6 +212,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
SliverChildBuilderDelegate((context, index) {
return FavVideoCardH(
videoItem: favList[index],
isOwner: _favDetailController.isOwner,
callFn: () => _favDetailController
.onCancelFav(favList[index].id),
);

View File

@ -18,12 +18,14 @@ class FavVideoCardH extends StatelessWidget {
final dynamic videoItem;
final Function? callFn;
final int? searchType;
final String isOwner;
const FavVideoCardH({
Key? key,
required this.videoItem,
this.callFn,
this.searchType,
required this.isOwner,
}) : super(key: key);
@override
@ -123,6 +125,7 @@ class FavVideoCardH extends StatelessWidget {
videoItem: videoItem,
callFn: callFn,
searchType: searchType,
isOwner: isOwner,
)
],
),
@ -140,11 +143,13 @@ class VideoContent extends StatelessWidget {
final dynamic videoItem;
final Function? callFn;
final int? searchType;
final String isOwner;
const VideoContent({
super.key,
required this.videoItem,
this.callFn,
this.searchType,
required this.isOwner,
});
@override
@ -211,7 +216,7 @@ class VideoContent extends StatelessWidget {
),
],
),
searchType != 1
searchType != 1 && isOwner == '1'
? Positioned(
right: 0,
bottom: -4,

View File

@ -100,6 +100,7 @@ class _FavSearchPageState extends State<FavSearchPage> {
return FavVideoCardH(
videoItem: _favSearchCtr.favList[index],
searchType: searchType,
isOwner: '0',
callFn: () => searchType != 1
? _favSearchCtr
.onCancelFav(_favSearchCtr.favList[index].id!)

View File

@ -27,6 +27,7 @@ class MemberController extends GetxController {
RxString attributeText = '关注'.obs;
RxList<MemberCoinsDataModel> recentCoinsList = <MemberCoinsDataModel>[].obs;
RxList<MemberLikeDataModel> recentLikeList = <MemberLikeDataModel>[].obs;
RxBool isOwner = false.obs;
@override
void onInit() {
@ -34,6 +35,7 @@ class MemberController extends GetxController {
mid = int.parse(Get.parameters['mid']!);
userInfo = userInfoCache.get('userInfoCache');
ownerMid = userInfo != null ? userInfo.mid : -1;
isOwner.value = mid == ownerMid;
face.value = Get.arguments['face'] ?? '';
heroTag = Get.arguments['heroTag'] ?? '';
relationSearch();
@ -197,11 +199,12 @@ class MemberController extends GetxController {
if (userInfo == null) return;
var res = await MemberHttp.getMemberSeasons(mid, 1, 10);
if (!res['status']) {
SmartDialog.showToast("用户专栏请求异常:${res['msg']}");
SmartDialog.showToast("用户合集请求异常:${res['msg']}");
} else {
// 只取前四个专栏
res['data'].seasonsList.map((e) {
e.archives = e.archives!.sublist(0, 4);
e.archives =
e.archives!.length > 4 ? e.archives!.sublist(0, 4) : e.archives!;
}).toList();
}
return res;
@ -235,4 +238,6 @@ class MemberController extends GetxController {
void pushRecentCoinsPage() async {
if (recentCoinsList.isNotEmpty) {}
}
void pushfavPage() => Get.toNamed('/fav?mid=$mid');
}

View File

@ -159,29 +159,47 @@ class _MemberPageState extends State<MemberPage>
profileWidget(),
/// 动态链接
ListTile(
onTap: _memberController.pushDynamicsPage,
title: const Text('Ta的动态'),
trailing:
const Icon(Icons.arrow_forward_outlined, size: 19),
Obx(
() => ListTile(
onTap: _memberController.pushDynamicsPage,
title: Text(
'${_memberController.isOwner.value ? '' : 'Ta'}的动态'),
trailing:
const Icon(Icons.arrow_forward_outlined, size: 19),
),
),
const Divider(height: 1, thickness: 0.1),
/// 视频
ListTile(
onTap: _memberController.pushArchivesPage,
title: const Text('Ta的投稿'),
trailing:
const Icon(Icons.arrow_forward_outlined, size: 19),
),
Obx(() => ListTile(
onTap: _memberController.pushArchivesPage,
title: Text(
'${_memberController.isOwner.value ? '' : 'Ta'}的投稿'),
trailing: const Icon(Icons.arrow_forward_outlined,
size: 19),
)),
const Divider(height: 1, thickness: 0.1),
/// 他的收藏夹
Obx(() => ListTile(
onTap: _memberController.pushfavPage,
title: Text(
'${_memberController.isOwner.value ? '' : 'Ta'}的收藏'),
trailing: const Icon(Icons.arrow_forward_outlined,
size: 19),
)),
const Divider(height: 1, thickness: 0.1),
/// 专栏
const ListTile(title: Text('Ta的专栏')),
Obx(() => ListTile(
title: Text(
'${_memberController.isOwner.value ? '' : 'Ta'}的专栏'))),
const Divider(height: 1, thickness: 0.1),
/// 合集
const ListTile(title: Text('Ta的合集')),
Obx(() => ListTile(
title: Text(
'${_memberController.isOwner.value ? '' : 'Ta'}的合集'))),
MediaQuery.removePadding(
removeTop: true,
removeBottom: true,
@ -212,8 +230,6 @@ class _MemberPageState extends State<MemberPage>
),
),
/// 收藏
/// 追番
/// 最近投币
Obx(

View File

@ -16,11 +16,17 @@ class SubController extends GetxController {
int currentPage = 1;
int pageSize = 20;
RxBool hasMore = true.obs;
late int mid;
late int ownerMid;
RxBool isOwner = false.obs;
@override
void onInit() {
super.onInit();
mid = int.parse(Get.parameters['mid'] ?? '-1');
userInfo = userInfoCache.get('userInfoCache');
ownerMid = userInfo != null ? userInfo!.mid! : -1;
isOwner.value = mid == -1 || mid == ownerMid;
}
Future<dynamic> querySubFolder({type = 'init'}) async {
@ -30,7 +36,7 @@ class SubController extends GetxController {
var res = await UserHttp.userSubFolder(
pn: currentPage,
ps: pageSize,
mid: userInfo!.mid!,
mid: isOwner.value ? ownerMid : mid,
);
if (res['status']) {
if (type == 'init') {

View File

@ -42,10 +42,10 @@ class _SubPageState extends State<SubPage> {
appBar: AppBar(
centerTitle: false,
titleSpacing: 0,
title: Text(
'的订阅',
style: Theme.of(context).textTheme.titleMedium,
),
title: Obx(() => Text(
'${_subController.isOwner.value ? '' : 'Ta'}的订阅',
style: Theme.of(context).textTheme.titleMedium,
)),
),
body: FutureBuilder(
future: _futureBuilderFuture,
@ -62,6 +62,7 @@ class _SubPageState extends State<SubPage> {
return SubItem(
subFolderItem:
_subController.subFolderData.value.list![index],
isOwner: _subController.isOwner.value,
cancelSub: _subController.cancelSub);
},
),

View File

@ -8,10 +8,12 @@ import '../../../models/user/sub_folder.dart';
class SubItem extends StatelessWidget {
final SubFolderItemData subFolderItem;
final bool isOwner;
final Function(SubFolderItemData) cancelSub;
const SubItem({
super.key,
required this.subFolderItem,
required this.isOwner,
required this.cancelSub,
});
@ -59,6 +61,7 @@ class SubItem extends StatelessWidget {
),
VideoContent(
subFolderItem: subFolderItem,
isOwner: isOwner,
cancelSub: cancelSub,
)
],
@ -73,8 +76,14 @@ class SubItem extends StatelessWidget {
class VideoContent extends StatelessWidget {
final SubFolderItemData subFolderItem;
final bool isOwner;
final Function(SubFolderItemData)? cancelSub;
const VideoContent({super.key, required this.subFolderItem, this.cancelSub});
const VideoContent({
super.key,
required this.subFolderItem,
required this.isOwner,
this.cancelSub,
});
@override
Widget build(BuildContext context) {
@ -111,22 +120,24 @@ class VideoContent extends StatelessWidget {
),
),
const Spacer(),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(
style: ButtonStyle(
padding: MaterialStateProperty.all(EdgeInsets.zero),
),
onPressed: () => cancelSub?.call(subFolderItem),
icon: Icon(
Icons.clear_outlined,
color: Theme.of(context).colorScheme.outline,
size: 18,
),
)
],
)
isOwner
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(
style: ButtonStyle(
padding: MaterialStateProperty.all(EdgeInsets.zero),
),
onPressed: () => cancelSub?.call(subFolderItem),
icon: Icon(
Icons.clear_outlined,
color: Theme.of(context).colorScheme.outline,
size: 18,
),
)
],
)
: const SizedBox()
],
),
),