logo和名称替换

This commit is contained in:
谢宇宁
2026-10-14 11:23:36 +07:00
parent 1cb514cd02
commit c5c04a7967
478 changed files with 8990 additions and 4948 deletions
+52 -24
View File
@@ -5,9 +5,9 @@ import 'dart:math' as math;
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/tools_base/unique_tag_mixin.dart';
import 'package:hgmj/tools_base/widget/sheet_handle_bar.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/tools_base/unique_tag_mixin.dart';
import 'package:wydj/tools_base/widget/sheet_handle_bar.dart';
import 'package:provider/provider.dart';
import '../../hj_model/splash/domain_source_model.dart';
@@ -26,10 +26,12 @@ import 'buy_vip_alert_logic.dart';
class BuyVipAlert extends StatefulWidget {
final String? vipId; //外部指定卡ID(可选),不传走分层卡/升级卡兜底
final String? videoId; //在看的那条内容 id,下单时透传给服务端做归因
final PayOrderTrackInfo? orderTrack; //整份下单上下文,短剧付费墙要带 mediaId/contentId/checkoutContextId
final PayOrderTrackInfo?
orderTrack; //整份下单上下文,短剧付费墙要带 mediaId/contentId/checkoutContextId
const BuyVipAlert({super.key, this.vipId, this.videoId, this.orderTrack});
static Future show({String? vipId, String? videoId, PayOrderTrackInfo? orderTrack}) {
static Future show(
{String? vipId, String? videoId, PayOrderTrackInfo? orderTrack}) {
return Get.bottomSheet(
BuyVipAlert(vipId: vipId, videoId: videoId, orderTrack: orderTrack),
isScrollControlled: true,
@@ -42,7 +44,10 @@ class BuyVipAlert extends StatefulWidget {
// 可叠弹(试看结束/超时长等多处触发),用 per-实例唯一 tag 隔离 controller
class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
late final logic = BuyVipAlertLogic(vId: widget.vipId, videoId: widget.videoId, orderTrack: widget.orderTrack);
late final logic = BuyVipAlertLogic(
vId: widget.vipId,
videoId: widget.videoId,
orderTrack: widget.orderTrack);
static const _sheetRadius = 26.0;
@@ -109,14 +114,18 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
_selectionBuilder(
(_) => Text(
_title,
style: const TextStyle(color: Color(0xE5FFFFFF), fontSize: 16, fontWeight: FontWeight.w500),
style: const TextStyle(
color: Color(0xE5FFFFFF),
fontSize: 16,
fontWeight: FontWeight.w500),
),
),
_buildCountdown(),
],
),
14.sizeBoxH,
_selectionBuilder((_) => _buildPriceInfo()), //原价 / 限时特价 / 优惠
_selectionBuilder(
(_) => _buildPriceInfo()), //原价 / 限时特价 / 优惠
16.sizeBoxH,
Expanded(
child: _buildContent(),
@@ -169,7 +178,8 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
child: CarouselSlider.builder(
carouselController: logic.pageCtr,
itemCount: mgr.vipCards.length + 2,
itemBuilder: (_, index, __) => _selectionBuilder((l) => l.instanceChildItem(index)),
itemBuilder: (_, index, __) => _selectionBuilder(
(l) => l.instanceChildItem(index)),
options: CarouselOptions(
height: logic.cardHeight,
viewportFraction: logic.itemRatio,
@@ -180,7 +190,8 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
enlargeCenterPage: false,
padEnds: false,
clipBehavior: Clip.none,
onPageChanged: (index, __) => logic.onPageChanged(index),
onPageChanged: (index, __) =>
logic.onPageChanged(index),
scrollDirection: Axis.horizontal,
),
),
@@ -230,7 +241,8 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
decoration: TextDecoration.lineThrough,
decorationColor: Color(0x8cFFFFFF),
);
const normal = TextStyle(color: Color(0x8cFFFFFF), fontSize: 14, fontWeight: FontWeight.w500);
const normal = TextStyle(
color: Color(0x8cFFFFFF), fontSize: 14, fontWeight: FontWeight.w500);
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@@ -238,16 +250,20 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
24.sizeBoxW,
_priceItem("限时特价", "¥$discounted", normal),
24.sizeBoxW,
_priceItem("优惠", "¥${(original - discounted).clamp(0, original)}", normal),
_priceItem(
"优惠", "¥${(original - discounted).clamp(0, original)}", normal),
],
);
}
Widget _priceItem(String title, String value, TextStyle valueStyle, {TextStyle? titleStyle}) {
Widget _priceItem(String title, String value, TextStyle valueStyle,
{TextStyle? titleStyle}) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(title, style: titleStyle ?? const TextStyle(color: Color(0x99FFFFFF), fontSize: 14)),
Text(title,
style: titleStyle ??
const TextStyle(color: Color(0x99FFFFFF), fontSize: 14)),
4.sizeBoxW,
Text(value, style: valueStyle),
],
@@ -260,7 +276,8 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
valueListenable: MineMsgProvider().tick,
builder: (_, __, ___) {
final c = MineMsgProvider().payTier?.config;
if (c == null || !c.hasDiscountCountdown) return const SizedBox.shrink();
if (c == null || !c.hasDiscountCountdown)
return const SizedBox.shrink();
return Row(
mainAxisSize: MainAxisSize.min,
children: [
@@ -281,27 +298,35 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
width: 24,
height: 24,
alignment: Alignment.center,
decoration: BoxDecoration(color: const Color(0xffE1351F), borderRadius: BorderRadius.circular(3)),
child: Text(value, style: const TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.w500)),
decoration: BoxDecoration(
color: const Color(0xffE1351F),
borderRadius: BorderRadius.circular(3)),
child: Text(value,
style: const TextStyle(
color: Colors.white, fontSize: 14, fontWeight: FontWeight.w500)),
);
}
Widget _colon() => const Padding(
padding: EdgeInsets.symmetric(horizontal: 2),
child: Text(":", style: TextStyle(color: Color(0xffDD001B), fontSize: 20)),
child:
Text(":", style: TextStyle(color: Color(0xffDD001B), fontSize: 20)),
);
/// 权益区:与会员中心同实验分支 —— classic=A/DISABLED,改版=ACTIVE+B
Widget _buildPrivilegeSections({required bool classic}) {
return _selectionBuilder((l) {
final privileges = l.currentProductModel?.newPrivilege ?? [];
// final coreList = privileges.where((p) => p.isCore == true).toList();
final moreList = privileges; // privileges.where((p) => p.isCore != true).toList();
// final coreList = privileges.where((p) => p.isCore == true).toList();
final moreList =
privileges; // privileges.where((p) => p.isCore != true).toList();
return Column(
mainAxisSize: MainAxisSize.min,
children: [
// classic ? _buildClassicCorePrivileges(coreList) : _buildCorePrivileges(coreList),
classic ? _buildClassicMorePrivileges(moreList) : _buildMorePrivileges(moreList),
// classic ? _buildClassicCorePrivileges(coreList) : _buildCorePrivileges(coreList),
classic
? _buildClassicMorePrivileges(moreList)
: _buildMorePrivileges(moreList),
],
);
});
@@ -358,7 +383,8 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
childAspectRatio: 63 / 100,
),
itemCount: list.length,
itemBuilder: (_, i) => VipProductPrivilegeItem(list[i], classic: true),
itemBuilder: (_, i) =>
VipProductPrivilegeItem(list[i], classic: true),
),
],
);
@@ -410,6 +436,8 @@ class _BuyVipTopBorderPainter extends CustomPainter {
@override
bool shouldRepaint(covariant _BuyVipTopBorderPainter oldDelegate) {
return oldDelegate.gradient != gradient || oldDelegate.strokeWidth != strokeWidth || oldDelegate.topRadius != topRadius;
return oldDelegate.gradient != gradient ||
oldDelegate.strokeWidth != strokeWidth ||
oldDelegate.topRadius != topRadius;
}
}
+37 -14
View File
@@ -2,10 +2,10 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/extension/extensions.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/tools_base/toast.dart';
import 'package:hgmj/tools_base/widget/sheet_handle_bar.dart';
import 'package:wydj/extension/extensions.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/tools_base/toast.dart';
import 'package:wydj/tools_base/widget/sheet_handle_bar.dart';
import 'package:provider/provider.dart';
import '../../assets_tool/app_colors.dart';
@@ -75,34 +75,48 @@ class _ComicBuyAlertState extends State<ComicBuyAlert> {
18.sizeBoxH,
const Text(
'购买作品',
style: TextStyle(color: Color(0xE5ffffff), fontSize: 20, fontWeight: FontWeight.w500),
style: TextStyle(
color: Color(0xE5ffffff),
fontSize: 20,
fontWeight: FontWeight.w500),
),
36.sizeBoxH,
//作品解锁价
Row(
children: [
const Text('作品解锁', style: TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Text('作品解锁',
style:
TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Spacer(),
GestureDetector(
onTap: () => pushToWalletPage(tabPosition: 1),
child: Text(
'$_price 金币',
style: const TextStyle(color: Color(0xffFF9000), fontSize: 14, fontWeight: FontWeight.w500),
style: const TextStyle(
color: Color(0xffFF9000),
fontSize: 14,
fontWeight: FontWeight.w500),
),
),
],
),
18.sizeBoxH,
Divider(height: 0.5, color: Colors.white.withValues(alpha: .05)),
Divider(
height: 0.5, color: Colors.white.withValues(alpha: .05)),
18.sizeBoxH,
//我的金币余额 + 充值入口
Row(
children: [
const Text('我的金币', style: TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Text('我的金币',
style:
TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Spacer(),
Text(
'${store.wallet?.amount?.toDouble().fixed(2) ?? 0}',
style: const TextStyle(color: Color(0xE5ffffff), fontSize: 14, fontWeight: FontWeight.w500),
style: const TextStyle(
color: Color(0xE5ffffff),
fontSize: 14,
fontWeight: FontWeight.w500),
),
12.sizeBoxW,
InkWell(
@@ -125,15 +139,22 @@ class _ComicBuyAlertState extends State<ComicBuyAlert> {
//支付按钮:余额不足直接去充值
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () => enough ? _buyProduct(true) : pushToWalletPage(tabPosition: 1),
onTap: () => enough
? _buyProduct(true)
: pushToWalletPage(tabPosition: 1),
child: Container(
width: double.infinity,
height: 47,
decoration: BoxDecoration(color: const Color(0xffFFC000), borderRadius: BorderRadius.circular(30)),
decoration: BoxDecoration(
color: const Color(0xffFFC000),
borderRadius: BorderRadius.circular(30)),
alignment: Alignment.center,
child: Text(
enough ? '$_price金币/立即支付' : '余额不足,前往充值',
style: const TextStyle(color: Color(0xff1F2029), fontSize: 16, fontWeight: FontWeight.w500),
style: const TextStyle(
color: Color(0xff1F2029),
fontSize: 16,
fontWeight: FontWeight.w500),
),
),
),
@@ -150,7 +171,9 @@ class _ComicBuyAlertState extends State<ComicBuyAlert> {
if (_isBuying) return; //纯防重入,build 不依赖它,改了不用 setState
_isBuying = true;
final productType = isAll ? ProductType.mediaAll : ProductType.mediaChapter;
final productID = isAll ? (widget.mediaInfo?.id ?? widget.curModel?.mediaId) : widget.curModel?.id;
final productID = isAll
? (widget.mediaInfo?.id ?? widget.curModel?.mediaId)
: widget.curModel?.id;
await PayManager().buy(
productID,
productType,
+33 -16
View File
@@ -2,14 +2,14 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:hgmj/assets_tool/app_colors.dart';
import 'package:hgmj/assets_tool/images.dart';
import 'package:hgmj/config/config.dart';
import 'package:hgmj/hj_model/user/user_info_model.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/tools_base/toast.dart';
import 'package:hgmj/tools_base/widget/common_dialog.dart';
import 'package:hgmj/tools_base/widget/net_image_widget.dart';
import 'package:wydj/assets_tool/app_colors.dart';
import 'package:wydj/assets_tool/images.dart';
import 'package:wydj/config/config.dart';
import 'package:wydj/hj_model/user/user_info_model.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/tools_base/toast.dart';
import 'package:wydj/tools_base/widget/common_dialog.dart';
import 'package:wydj/tools_base/widget/net_image_widget.dart';
import 'package:qr_flutter/qr_flutter.dart';
import '../../config/address.dart';
@@ -72,7 +72,8 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
//app 图标 + 名称 + 标语
Row(
children: [
Image.asset('ic_launcher.webp'.commonImgPath, width: 48.w, height: 48.w),
Image.asset('ic_launcher.webp'.commonImgPath,
width: 48.w, height: 48.w),
10.w.sizeBoxW,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -80,10 +81,16 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
children: [
Text(
Config.appName,
style: TextStyle(color: Colors.white.withValues(alpha: .9), fontWeight: FontWeight.w500, fontSize: 14),
style: TextStyle(
color: Colors.white.withValues(alpha: .9),
fontWeight: FontWeight.w500,
fontSize: 14),
),
4.sizeBoxH,
Text("百万大神短剧原创", style: TextStyle(color: Colors.white.withValues(alpha: .55), fontSize: 10)),
Text("百万大神短剧原创",
style: TextStyle(
color: Colors.white.withValues(alpha: .55),
fontSize: 10)),
],
),
],
@@ -110,7 +117,8 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
height: 94,
padding: const EdgeInsets.all(2),
color: Colors.white,
child: QrImageView(data: _shareUrl, padding: EdgeInsets.zero),
child: QrImageView(
data: _shareUrl, padding: EdgeInsets.zero),
),
16.sizeBoxW,
Expanded(
@@ -120,13 +128,18 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
children: [
Text(
"邀请码${_me?.promotionCode ?? ""}",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Colors.white.withValues(alpha: .9)),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w500,
color: Colors.white.withValues(alpha: .9)),
),
20.sizeBoxH,
Text(
'每邀请 1人 送 1天 会员 ${Address.groundUrl}',
maxLines: 2,
style: TextStyle(fontSize: 12, color: Colors.white.withValues(alpha: .55)),
style: TextStyle(
fontSize: 12,
color: Colors.white.withValues(alpha: .55)),
),
],
),
@@ -164,7 +177,10 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
);
}
Widget _button(String text, {required Color bgColor, required Color textColor, required VoidCallback onTap}) {
Widget _button(String text,
{required Color bgColor,
required Color textColor,
required VoidCallback onTap}) {
return InkWell(
enableFeedback: false,
onTap: onTap,
@@ -177,7 +193,8 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
),
child: Text(
text,
style: TextStyle(fontSize: 16, color: textColor, fontWeight: FontWeight.w500),
style: TextStyle(
fontSize: 16, color: textColor, fontWeight: FontWeight.w500),
),
),
);
+42 -22
View File
@@ -1,15 +1,15 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/assets_tool/app_colors.dart';
import 'package:hgmj/extension/extensions.dart';
import 'package:hgmj/hj_model/video_model.dart';
import 'package:hgmj/hj_page/mine/widgets/gradient_text.dart';
import 'package:hgmj/hj_page/mine/mine_vip/widgets/coin_pay_bottom_sheet.dart';
import 'package:hgmj/hj_utils/pay/pay_manager.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/routers/jump_router.dart';
import 'package:hgmj/tools_base/global_store/store.dart';
import 'package:hgmj/tools_base/widget/sheet_handle_bar.dart';
import 'package:wydj/assets_tool/app_colors.dart';
import 'package:wydj/extension/extensions.dart';
import 'package:wydj/hj_model/video_model.dart';
import 'package:wydj/hj_page/mine/widgets/gradient_text.dart';
import 'package:wydj/hj_page/mine/mine_vip/widgets/coin_pay_bottom_sheet.dart';
import 'package:wydj/hj_utils/pay/pay_manager.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/routers/jump_router.dart';
import 'package:wydj/tools_base/global_store/store.dart';
import 'package:wydj/tools_base/widget/sheet_handle_bar.dart';
import 'package:provider/provider.dart';
///金币购买作品面板
@@ -33,7 +33,8 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
bool get _noDiscount => _video.newsType == "PIC" || _isSeedLink;
//实际售价:无折扣品类按原价,其余按折后价
String get _priceText => '${(_noDiscount ? _video.originCoins : _video.coins) ?? 0} 金币';
String get _priceText =>
'${(_noDiscount ? _video.originCoins : _video.coins) ?? 0} 金币';
@override
void initState() {
@@ -61,19 +62,26 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
18.sizeBoxH,
const Text(
'购买作品',
style: TextStyle(color: Color(0xE5ffffff), fontSize: 20, fontWeight: FontWeight.w500),
style: TextStyle(
color: Color(0xE5ffffff),
fontSize: 20,
fontWeight: FontWeight.w500),
),
18.sizeBoxH,
//作品解锁价
Row(
children: [
const Text('作品解锁', style: TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Text('作品解锁',
style: TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Spacer(),
GestureDetector(
onTap: () => CoinPayBottomSheet.show(),
child: Text(
_priceText,
style: const TextStyle(color: Color(0xffFF9000), fontSize: 14, fontWeight: FontWeight.w500),
style: const TextStyle(
color: Color(0xffFF9000),
fontSize: 14,
fontWeight: FontWeight.w500),
),
),
],
@@ -86,11 +94,15 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
//我的金币余额 + 充值入口
Row(
children: [
const Text('我的金币', style: TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Text('我的金币',
style: TextStyle(color: Color(0xE5ffffff), fontSize: 14)),
const Spacer(),
Text(
'${store.wallet?.amount?.toDouble().fixed(2) ?? 0}',
style: const TextStyle(color: Color(0xE5ffffff), fontSize: 14, fontWeight: FontWeight.w500),
style: const TextStyle(
color: Color(0xE5ffffff),
fontSize: 14,
fontWeight: FontWeight.w500),
),
12.sizeBoxW,
InkWell(
@@ -164,7 +176,8 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
return [
Row(
children: [
const Text('作品原价', style: TextStyle(color: Color(0xE5FFFFFF), fontSize: 14)),
const Text('作品原价',
style: TextStyle(color: Color(0xE5FFFFFF), fontSize: 14)),
const Spacer(),
Text(
'${_video.originCoins ?? 0} 金币',
@@ -183,14 +196,16 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
GradientText(
discountText,
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400),
gradient: const LinearGradient(colors: [Color(0xffAC7E6E), Color(0xffA4634D)]),
gradient: const LinearGradient(
colors: [Color(0xffAC7E6E), Color(0xffA4634D)]),
),
const Spacer(),
GestureDetector(
onTap: () => pushToWalletPage(),
child: GradientText(
isVip ? '升级会员免费看' : '购买VIP免费看',
gradient: const LinearGradient(colors: [Color(0xffAC7E6E), Color(0xffA4634D)]),
gradient: const LinearGradient(
colors: [Color(0xffAC7E6E), Color(0xffA4634D)]),
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
@@ -205,7 +220,10 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
];
}
Widget _button(String text, {required Color textColor, required BoxDecoration decoration, required VoidCallback onTap}) {
Widget _button(String text,
{required Color textColor,
required BoxDecoration decoration,
required VoidCallback onTap}) {
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: onTap,
@@ -215,7 +233,8 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
decoration: decoration,
child: Text(
text,
style: TextStyle(color: textColor, fontSize: 16, fontWeight: FontWeight.w500),
style: TextStyle(
color: textColor, fontSize: 16, fontWeight: FontWeight.w500),
),
),
);
@@ -227,7 +246,8 @@ class _VideoBuyBottomSheetState extends State<VideoBuyBottomSheet> {
return;
}
//黄游(SEED_LINK)和普通视频都按单片算,动漫按整部算
final type = (!_isSeedLink && _isCartoon) ? ProductType.mediaAll : ProductType.media;
final type =
(!_isSeedLink && _isCartoon) ? ProductType.mediaAll : ProductType.media;
await PayManager().buy(
_video.id,
type,
+5 -3
View File
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/tools_base/widget/sheet_handle_bar.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/tools_base/widget/sheet_handle_bar.dart';
import '../../config/address.dart';
import '../../hj_model/splash/domain_source_model.dart';
@@ -70,7 +70,9 @@ class VideoLineMenuAlert extends StatelessWidget {
domain.desc ?? "",
style: TextStyle(
fontSize: 14,
color: isSelected ? Color(0xffFFC000) : Colors.white.withValues(alpha: 0.45),
color: isSelected
? Color(0xffFFC000)
: Colors.white.withValues(alpha: 0.45),
fontWeight: isSelected ? FontWeight.w500 : FontWeight.w400,
),
),
+19 -8
View File
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:hgmj/assets_tool/app_colors.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/routers/jump_router.dart';
import 'package:hgmj/tools_base/widget/common_dialog.dart';
import 'package:wydj/assets_tool/app_colors.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/routers/jump_router.dart';
import 'package:wydj/tools_base/widget/common_dialog.dart';
/// 动漫/图集的 VIP 门槛提示弹窗:只有文案和一个开通按钮
class VipACGDialog extends StatelessWidget {
@@ -16,13 +16,19 @@ class VipACGDialog extends StatelessWidget {
children: [
Text(
"温馨提示",
style: TextStyle(fontSize: 20, color: Colors.white.withValues(alpha: .9), fontWeight: FontWeight.w500),
style: TextStyle(
fontSize: 20,
color: Colors.white.withValues(alpha: .9),
fontWeight: FontWeight.w500),
),
24.sizeBoxH,
Text(
"本内容需要开通VIP会员\n开通会员 即可解锁查看完整版",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16, color: Colors.white.withValues(alpha: .45), height: 2),
style: TextStyle(
fontSize: 16,
color: Colors.white.withValues(alpha: .45),
height: 2),
),
24.sizeBoxH,
//开通按钮。margin 留在 InkWell 外,否则左右各 12 的空白会被算进点击热区
@@ -34,10 +40,15 @@ class VipACGDialog extends StatelessWidget {
child: Container(
height: 44,
alignment: Alignment.center,
decoration: BoxDecoration(color: AppColors.actionRed, borderRadius: BorderRadius.circular(30)),
decoration: BoxDecoration(
color: AppColors.actionRed,
borderRadius: BorderRadius.circular(30)),
child: const Text(
"立即开通",
style: TextStyle(fontSize: 16, color: Color(0xff1F2029), fontWeight: FontWeight.w500),
style: TextStyle(
fontSize: 16,
color: Color(0xff1F2029),
fontWeight: FontWeight.w500),
),
),
),