角标修改

This commit is contained in:
谢宇宁
2026-11-05 19:32:24 +07:00
parent bee47e14e6
commit 2b3bc68c47
3 changed files with 141 additions and 83 deletions
@@ -4,11 +4,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:wydj/assets_tool/images.dart';
import 'package:wydj/config/config.dart';
import 'package:wydj/hj_model/drama_media_info.dart';
import 'package:wydj/hj_page/drama/drama_detail_page.dart';
import 'package:wydj/hj_page/drama/drama_tag_detail_page.dart';
import 'package:wydj/hj_utils/free_play_manager.dart';
import 'package:wydj/tools_base/widget/net_image_widget.dart';
/// AI 短剧封面卡:按 Figma「短片封面展示样式」独立绘制。
@@ -114,12 +112,6 @@ class DramaCoverCard extends StatelessWidget {
],
),
),
if (_badge != null)
Positioned(
top: 0,
right: 0,
child: _badge!,
),
],
);
}
@@ -192,65 +184,4 @@ class DramaCoverCard extends StatelessWidget {
}
return '全${max(mediaInfo.totalEpisode ?? 1, 1)}集';
}
Widget? get _badge {
if (mediaInfo.permissionIconHide == true) return null;
/// 免费
/// Config.freeMark 后端下发是否展示免费角标
/// mediaInfo.permission == 2视频为免费
/// FreePlayManager().canShowFreeBadge() 免费观看次数是否可看, 相等于 需要金币或者vip观看的,只要免费观看次数有,都为免费
if (Config.freeMark &&
(mediaInfo.permission == 2 || FreePlayManager().canShowFreeBadge())) {
return _cornerBadge(
'免费',
const Color(0xFF1CD302),
Colors.white,
);
}
/// Vip
if (Config.vipMark && mediaInfo.permission == 0) {
return _cornerBadge(
'VIP',
null,
Colors.white,
gradient: const LinearGradient(
begin: Alignment(-0.6, 1),
end: Alignment(0.8, -1),
colors: [Color(0xFFFF8000), Color(0xFFFF7A01)],
),
);
}
/// 金币
if (Config.coinMark && mediaInfo.permission == 1) {
return _cornerBadge(
'金币',
const Color(0xFFFFCC14),
const Color(0xFF292929),
);
}
return null;
}
Widget _cornerBadge(String text, Color? color, Color textColor,
{Gradient? gradient}) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 6),
decoration: BoxDecoration(
color: color,
gradient: gradient,
borderRadius: BorderRadius.circular(3),
),
child: Text(
text,
style: TextStyle(
color: textColor,
fontSize: 10,
height: 16 / 10,
),
),
);
}
}
@@ -1,11 +1,9 @@
import 'package:flutter/material.dart';
import '../../../config/config.dart';
import '../../../hj_model/video_model.dart';
import '../../../hj_utils/free_play_manager.dart';
/// 封面右上角的售卖角标:免费试看 / 金币 / VIP,三者互斥,都不满足就不占位。
/// 展不展示还受 ping 下发的 freeMark / coinMark / vipMark 三个开关控制
/// 封面右上角的角标:只展示 VIP 角标,金币视频不展示角标,都不满足就不占位。
/// VIP 视频后端同时会下发 showFreeTrialBadge,这里不展示免费试看角标,避免盖掉 VIP
class LevelMarkChip extends StatelessWidget {
final VideoModel? videoModel;
@@ -13,21 +11,22 @@ class LevelMarkChip extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (videoModel?.freeArea == true) return const SizedBox();
// 免费试看:ping 免费类角标总开关 freeMark + 实时试看权益(次数用尽即不再展示)
if (Config.freeMark && FreePlayManager().canShowFreeTrialBadge(videoModel)) {
return _chip("免费", const Color(0xffffffff), const [Color(0xff1CD302), Color(0xff1CD302)]);
}
final isCoin = videoModel?.isCoinVideo() == true;
if (isCoin && Config.coinMark) {
return _chip("金币", const Color(0xff1F2029), const [Color(0xffFFE580), Color(0xffFACC15)]);
}
if (!isCoin && Config.vipMark) {
final video = videoModel;
if (video == null) return const SizedBox();
if (_isVip(video)) {
return _chip("VIP", const Color(0xffFFFFFF), const [Color(0xffFF8000), Color(0xffFF7A01)]);
}
return const SizedBox();
}
/// 动漫/漫画/小说按 permission 判断(0=会员),普通视频按原价为 0 且不在免费区判断
bool _isVip(VideoModel video) {
if (const ['video', 'image', 'text'].contains(video.mediaType)) {
return video.permission == 0;
}
return video.originCoins == 0 && video.freeArea != true;
}
Widget _chip(String text, Color textColor, List<Color> gradientColors) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 1),