mod: 修改取消收藏的逻辑 issues#60

This commit is contained in:
guozhigq
2023-09-04 12:41:28 +08:00
parent 6f84eefbe4
commit 0f134b8dca
3 changed files with 150 additions and 127 deletions

View File

@ -14,7 +14,7 @@ class FavDetailController extends GetxController {
int currentPage = 1; int currentPage = 1;
bool isLoadingMore = false; bool isLoadingMore = false;
RxMap favInfo = {}.obs; RxMap favInfo = {}.obs;
RxList<FavDetailItemData> favList = [FavDetailItemData()].obs; RxList favList = [].obs;
RxString loadingText = '加载中...'.obs; RxString loadingText = '加载中...'.obs;
int mediaCount = 0; int mediaCount = 0;
@ -61,15 +61,13 @@ class FavDetailController extends GetxController {
aid: id, addIds: '', delIds: mediaId.toString()); aid: id, addIds: '', delIds: mediaId.toString());
if (result['status']) { if (result['status']) {
if (result['data']['prompt']) { if (result['data']['prompt']) {
List<FavDetailItemData> dataList = favDetailData.value.medias!; List dataList = favList;
for (var i in dataList) { for (var i in dataList) {
if (i.id == id) { if (i.id == id) {
dataList.remove(i); dataList.remove(i);
break; break;
} }
} }
favDetailData.value.medias = dataList;
favDetailData.refresh();
SmartDialog.showToast('取消收藏'); SmartDialog.showToast('取消收藏');
} }
} }

View File

@ -168,7 +168,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
padding: const EdgeInsets.only(top: 15, bottom: 8, left: 14), padding: const EdgeInsets.only(top: 15, bottom: 8, left: 14),
child: Obx( child: Obx(
() => Text( () => Text(
'${_favDetailController.favInfo['media_count'] ?? '-'}条视频', '${_favDetailController.favList.length}条视频',
style: TextStyle( style: TextStyle(
fontSize: fontSize:
Theme.of(context).textTheme.labelMedium!.fontSize, Theme.of(context).textTheme.labelMedium!.fontSize,
@ -187,14 +187,20 @@ class _FavDetailPageState extends State<FavDetailPage> {
if (_favDetailController.item!.mediaCount == 0) { if (_favDetailController.item!.mediaCount == 0) {
return const NoData(); return const NoData();
} else { } else {
List favList = _favDetailController.favList;
return Obx( return Obx(
() => SliverList( () => favList.isEmpty
delegate: SliverChildBuilderDelegate((context, index) { ? const SliverToBoxAdapter(child: SizedBox())
return FavVideoCardH( : SliverList(
videoItem: _favDetailController.favList[index], delegate:
); SliverChildBuilderDelegate((context, index) {
}, childCount: _favDetailController.favList.length), return FavVideoCardH(
), videoItem: favList[index],
callFn: () => _favDetailController
.onCancelFav(favList[index].id),
);
}, childCount: favList.length),
),
); );
} }
} else { } else {

View File

@ -10,134 +10,109 @@ import 'package:pilipala/utils/id_utils.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import '../controller.dart';
// 收藏视频卡片 - 水平布局 // 收藏视频卡片 - 水平布局
class FavVideoCardH extends StatelessWidget { class FavVideoCardH extends StatelessWidget {
final dynamic videoItem; final dynamic videoItem;
final FavDetailController _favDetailController = final Function? callFn;
Get.put(FavDetailController());
FavVideoCardH({Key? key, required this.videoItem}) : super(key: key); const FavVideoCardH({Key? key, required this.videoItem, this.callFn})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
int id = videoItem.id; int id = videoItem.id;
String bvid = videoItem.bvid ?? IdUtils.av2bv(id); String bvid = videoItem.bvid ?? IdUtils.av2bv(id);
String heroTag = Utils.makeHeroTag(id); String heroTag = Utils.makeHeroTag(id);
return Dismissible( return InkWell(
movementDuration: const Duration(milliseconds: 300), onTap: () async {
background: Container( // int? seasonId;
decoration: BoxDecoration( String? epId;
color: Theme.of(context).colorScheme.errorContainer, if (videoItem.ogv != null && videoItem.ogv['type_name'] == '番剧') {
), videoItem.cid = await SearchHttp.ab2c(bvid: bvid);
child: const Row( // seasonId = videoItem.ogv['season_id'];
mainAxisAlignment: MainAxisAlignment.center, epId = videoItem.epId;
children: [ } else if (videoItem.page == 0 || videoItem.page > 1) {
Icon(Icons.clear_all_rounded), var result = await VideoHttp.videoIntro(bvid: bvid);
SizedBox(width: 6), if (result['status']) {
Text('取消收藏') epId = result['data'].epId;
],
)),
direction: DismissDirection.endToStart,
key: ValueKey<int>(videoItem.id),
onDismissed: (DismissDirection direction) {
_favDetailController.onCancelFav(videoItem.id);
// widget.onDeleteNotice();
},
child: InkWell(
onTap: () async {
// int? seasonId;
String? epId;
if (videoItem.ogv != null && videoItem.ogv['type_name'] == '番剧') {
videoItem.cid = await SearchHttp.ab2c(bvid: bvid);
// seasonId = videoItem.ogv['season_id'];
epId = videoItem.epId;
} else if (videoItem.page == 0 || videoItem.page > 1) {
var result = await VideoHttp.videoIntro(bvid: bvid);
if (result['status']) {
epId = result['data'].epId;
}
} }
}
Map<String, String> parameters = { Map<String, String> parameters = {
'bvid': bvid, 'bvid': bvid,
'cid': videoItem.cid.toString(), 'cid': videoItem.cid.toString(),
'epId': epId ?? '', 'epId': epId ?? '',
}; };
// if (seasonId != null) { // if (seasonId != null) {
// parameters['seasonId'] = seasonId.toString(); // parameters['seasonId'] = seasonId.toString();
// } // }
Get.toNamed('/video', parameters: parameters, arguments: { Get.toNamed('/video', parameters: parameters, arguments: {
'videoItem': videoItem, 'videoItem': videoItem,
'heroTag': heroTag, 'heroTag': heroTag,
'videoType': 'videoType':
epId != null ? SearchType.media_bangumi : SearchType.video, epId != null ? SearchType.media_bangumi : SearchType.video,
}); });
}, },
child: Column( child: Column(
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.fromLTRB( padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 5, StyleString.safeSpace, 5), StyleString.safeSpace, 5, StyleString.safeSpace, 5),
child: LayoutBuilder( child: LayoutBuilder(
builder: (context, boxConstraints) { builder: (context, boxConstraints) {
double width = double width =
(boxConstraints.maxWidth - StyleString.cardSpace * 6) / 2; (boxConstraints.maxWidth - StyleString.cardSpace * 6) / 2;
return SizedBox( return SizedBox(
height: width / StyleString.aspectRatio, height: width / StyleString.aspectRatio,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
AspectRatio( AspectRatio(
aspectRatio: StyleString.aspectRatio, aspectRatio: StyleString.aspectRatio,
child: LayoutBuilder( child: LayoutBuilder(
builder: (context, boxConstraints) { builder: (context, boxConstraints) {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
children: [ children: [
Hero( Hero(
tag: heroTag, tag: heroTag,
child: NetworkImgLayer( child: NetworkImgLayer(
src: videoItem.pic, src: videoItem.pic,
width: maxWidth, width: maxWidth,
height: maxHeight, height: maxHeight,
),
),
Positioned(
right: 4,
bottom: 4,
child: Container(
padding: const EdgeInsets.symmetric(
vertical: 1, horizontal: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.black54.withOpacity(0.4)),
child: Text(
Utils.timeFormat(videoItem.duration!),
style: const TextStyle(
fontSize: 11, color: Colors.white),
), ),
), ),
Positioned( )
right: 4, ],
bottom: 4, );
child: Container( },
padding: const EdgeInsets.symmetric(
vertical: 1, horizontal: 6),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(4),
color:
Colors.black54.withOpacity(0.4)),
child: Text(
Utils.timeFormat(videoItem.duration!),
style: const TextStyle(
fontSize: 11, color: Colors.white),
),
),
)
],
);
},
),
), ),
VideoContent(videoItem: videoItem) ),
], VideoContent(videoItem: videoItem, callFn: callFn)
), ],
); ),
}, );
), },
), ),
], ),
), ],
), ),
); );
} }
@ -145,7 +120,8 @@ class FavVideoCardH extends StatelessWidget {
class VideoContent extends StatelessWidget { class VideoContent extends StatelessWidget {
final dynamic videoItem; final dynamic videoItem;
const VideoContent({super.key, required this.videoItem}); final Function? callFn;
const VideoContent({super.key, required this.videoItem, this.callFn});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -173,7 +149,6 @@ class VideoContent extends StatelessWidget {
color: Theme.of(context).colorScheme.outline, color: Theme.of(context).colorScheme.outline,
), ),
), ),
const SizedBox(height: 2),
Row( Row(
children: [ children: [
StatView( StatView(
@ -181,7 +156,51 @@ class VideoContent extends StatelessWidget {
view: videoItem.cntInfo['play'], view: videoItem.cntInfo['play'],
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
StatDanMu(theme: 'gray', danmu: videoItem.cntInfo['danmaku']) StatDanMu(theme: 'gray', danmu: videoItem.cntInfo['danmaku']),
const Spacer(),
SizedBox(
width: 26,
height: 26,
child: IconButton(
style: ButtonStyle(
padding: MaterialStateProperty.all(EdgeInsets.zero),
),
onPressed: () {
showDialog(
context: Get.context!,
builder: (context) {
return AlertDialog(
title: const Text('提示'),
content: const Text('要取消收藏吗?'),
actions: [
TextButton(
onPressed: () => Get.back(),
child: Text(
'取消',
style: TextStyle(
color: Theme.of(context)
.colorScheme
.outline),
)),
TextButton(
onPressed: () async {
await callFn!();
Get.back();
},
child: const Text('确定取消'),
)
],
);
},
);
},
icon: Icon(
Icons.clear_outlined,
color: Theme.of(context).colorScheme.outline,
size: 18,
),
),
),
], ],
), ),
], ],