删除埋点,im和客服

This commit is contained in:
谢宇宁
2026-10-08 20:10:40 +07:00
parent 92816047c6
commit 5064de7399
133 changed files with 220 additions and 1405 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

-3
View File
@@ -6,7 +6,6 @@ import '../../hj_model/splash/ads_model.dart';
import '../../hj_utils/screen.dart'; import '../../hj_utils/screen.dart';
import '../../tools_base/banner/ads_banner.dart'; import '../../tools_base/banner/ads_banner.dart';
import '../../tools_base/banner/ads_item.dart'; import '../../tools_base/banner/ads_item.dart';
import '../../track_event_manager/track_manager.dart';
class AppCenterDialog extends StatefulWidget { class AppCenterDialog extends StatefulWidget {
final List<AdsInfoModel>? appList; final List<AdsInfoModel>? appList;
@@ -60,7 +59,6 @@ class _AppCenterDialogState extends State<AppCenterDialog> {
width: 329, width: 329,
height: 88, height: 88,
autoPlayMs: 5000, autoPlayMs: 5000,
exposureModel: AdExposureModel(pageType: TrackEventPageType.home, adType: AdType.moreIcon),
), ),
), ),
//Flexible 兜住矮屏:内容再多也不会顶破屏幕 //Flexible 兜住矮屏:内容再多也不会顶破屏幕
@@ -81,7 +79,6 @@ class _AppCenterDialogState extends State<AppCenterDialog> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
return AdsItem( return AdsItem(
adInfo: _appList[index], adInfo: _appList[index],
exposureModel: AdExposureModel(pageType: TrackEventPageType.home, adType: AdType.moreIcon),
); );
}, },
), ),
@@ -8,7 +8,6 @@ import 'package:jydj/hj_model/splash/ads_model.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import '../../tools_base/banner/ads_item.dart'; import '../../tools_base/banner/ads_item.dart';
import '../../track_event_manager/track_manager.dart';
/// 系统公告--图片公告 /// 系统公告--图片公告
class NoticeImageDialog extends StatelessWidget { class NoticeImageDialog extends StatelessWidget {
@@ -30,7 +29,6 @@ class NoticeImageDialog extends StatelessWidget {
adInfo: model!, adInfo: model!,
showType: AdShowType.img, showType: AdShowType.img,
aspectRatio: 6 / 8, aspectRatio: 6 / 8,
exposureModel: AdExposureModel(pageType: TrackEventPageType.home, adType: AdType.dialog),
), ),
20.sizeBoxH, 20.sizeBoxH,
InkWell(enableFeedback: false, InkWell(enableFeedback: false,
@@ -71,7 +69,6 @@ class SystemImagesDialog extends StatelessWidget {
adInfo: ads![index], adInfo: ads![index],
showType: AdShowType.img, showType: AdShowType.img,
aspectRatio: 6 / 8, aspectRatio: 6 / 8,
exposureModel: AdExposureModel(pageType: TrackEventPageType.home, adType: AdType.dialog),
), ),
); );
}, },
-63
View File
@@ -3,8 +3,6 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'package:carousel_slider/carousel_slider.dart'; import 'package:carousel_slider/carousel_slider.dart';
import 'package:easy_rich_text/easy_rich_text.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
@@ -12,7 +10,6 @@ import 'package:jydj/tools_base/unique_tag_mixin.dart';
import 'package:jydj/tools_base/widget/sheet_handle_bar.dart'; import 'package:jydj/tools_base/widget/sheet_handle_bar.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../assets_tool/images.dart';
import '../../hj_model/splash/domain_source_model.dart'; import '../../hj_model/splash/domain_source_model.dart';
import '../../hj_page/main_page/provider/msg_provider.dart'; import '../../hj_page/main_page/provider/msg_provider.dart';
import '../../hj_page/mine/mine_vip/mine_charge_vip_logic.dart'; import '../../hj_page/mine/mine_vip/mine_charge_vip_logic.dart';
@@ -22,7 +19,6 @@ import '../../hj_page/mine/mine_vip/vip_pay_button.dart';
import '../../hj_page/mine/mine_vip/vip_product_manager.dart'; import '../../hj_page/mine/mine_vip/vip_product_manager.dart';
import '../../hj_page/mine/mine_vip/vip_support_model.dart'; import '../../hj_page/mine/mine_vip/vip_support_model.dart';
import '../../hj_page/mine/mine_vip/vip_ui_kit.dart'; import '../../hj_page/mine/mine_vip/vip_ui_kit.dart';
import '../../routers/jump_router.dart';
import '../../tools_base/loading/loading_center_widget.dart'; import '../../tools_base/loading/loading_center_widget.dart';
import 'buy_vip_alert_logic.dart'; import 'buy_vip_alert_logic.dart';
@@ -207,18 +203,6 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_selectionBuilder((l) => VipPayButton(l, classic: classic)), _selectionBuilder((l) => VipPayButton(l, classic: classic)),
12.sizeBoxH,
EasyRichText(
'支付问题反馈,点击联系 在线客服',
patternList: [
EasyRichTextPattern(
targetString: '在线客服',
style: const TextStyle(color: Color(0xFFFFD460), fontSize: 12),
recognizer: TapGestureRecognizer()..onTap = () => pushToCustomService(),
)
],
defaultStyle: const TextStyle(color: Color(0xffDCDCDC), fontSize: 12),
),
], ],
), ),
) )
@@ -323,53 +307,6 @@ class _BuyVipAlertState extends State<BuyVipAlert> with UniqueTagMixin {
}); });
} }
// 核心权益:横向滚动卡片 —— B 改版
Widget _buildCorePrivileges(List<NewPrivilege> list) {
if (list.isEmpty) return const SizedBox.shrink();
return Column(
children: [
const VipCoreSectionTitleImage(),
16.sizeBoxH,
SizedBox(
height: 92,
child: ListView.separated(
clipBehavior: Clip.none,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.fromLTRB(16, 2, 16, 26),
itemCount: list.length,
separatorBuilder: (_, __) => 8.sizeBoxW,
itemBuilder: (_, i) => VipCorePrivilegeCard(list[i]),
),
),
16.sizeBoxH,
],
);
}
// 核心权益:一行金边方卡横向滑动 —— A / DISABLED
Widget _buildClassicCorePrivileges(List<NewPrivilege> list) {
if (list.isEmpty) return const SizedBox.shrink();
return Column(
children: [
const VipSectionTitle('我的核心权益', classic: true),
16.sizeBoxH,
SizedBox(
//设计稿一行放得下 4 张多一点,第 5 张露半张提示可以划
height: 72,
child: ListView.separated(
clipBehavior: Clip.none, // 金边有外发光,裁了会缺一圈
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 16),
itemCount: list.length,
separatorBuilder: (_, __) => 8.sizeBoxW,
itemBuilder: (_, i) => SizedBox(width: 72, child: VipCorePrivilegeCard(list[i], classic: true)),
),
),
16.sizeBoxH,
],
);
}
// 更多权益:深色圆角 + 四列网格 —— B 改版 // 更多权益:深色圆角 + 四列网格 —— B 改版
Widget _buildMorePrivileges(List<NewPrivilege> list) { Widget _buildMorePrivileges(List<NewPrivilege> list) {
if (list.isEmpty) return const SizedBox.shrink(); if (list.isEmpty) return const SizedBox.shrink();
+3 -3
View File
@@ -3,9 +3,9 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/app_colors.dart'; import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/config/config.dart'; import 'package:jydj/config/config.dart';
import 'package:jydj/hj_model/user/user_info_model.dart'; import 'package:jydj/hj_model/user/user_info_model.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/toast.dart'; import 'package:jydj/tools_base/toast.dart';
import 'package:jydj/tools_base/widget/common_dialog.dart'; import 'package:jydj/tools_base/widget/common_dialog.dart';
@@ -72,7 +72,7 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
//app 图标 + 名称 + 标语 //app 图标 + 名称 + 标语
Row( Row(
children: [ children: [
Image.asset(HolidayTheme.theme.appIcon, width: 48.w, height: 48.w), Image.asset('ic_launcher.webp'.commonImgPath, width: 48.w, height: 48.w),
10.w.sizeBoxW, 10.w.sizeBoxW,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -124,7 +124,7 @@ class _ShareMediaDialogState extends State<ShareMediaDialog> {
), ),
20.sizeBoxH, 20.sizeBoxH,
Text( Text(
'每邀请 1人 送 1天 会员 ${Address.groundUrl ?? ""}', '每邀请 1人 送 1天 会员 ${Address.groundUrl}',
maxLines: 2, maxLines: 2,
style: TextStyle(fontSize: 12, color: Colors.white.withValues(alpha: .55)), style: TextStyle(fontSize: 12, color: Colors.white.withValues(alpha: .55)),
), ),
-2
View File
@@ -22,6 +22,4 @@ extension ImageLoad on String {
String get launchPath => 'assets/images/launch/$this'; String get launchPath => 'assets/images/launch/$this';
//app icon //app icon
String get appImgPath => 'assets/images/app_icon/$this'; String get appImgPath => 'assets/images/app_icon/$this';
//节日皮肤
String get holidayPath => 'assets/images/holiday/$this';
} }
-8
View File
@@ -1,5 +1,4 @@
import '../../tools_base/banner/ads_grid_view.dart'; import '../../tools_base/banner/ads_grid_view.dart';
import '../../track_event_manager/track_manager.dart';
/// 广告信息 /// 广告信息
class AdsInfoModel { class AdsInfoModel {
@@ -59,13 +58,6 @@ class AdsInfoModel {
_ => AdStyle.twoAutoScroll, _ => AdStyle.twoAutoScroll,
}; };
/// 广告样式对应的埋点类型
AdType get adType => switch (coverImgSize) {
'vertical-cube' => AdType.verticalIcon,
'banner-720300' => AdType.bigBanner,
_ => AdType.smallIcon,
};
//同时兼容 Adv(image/name/url) 与 ShuApp(icon/name/url) 字段 //同时兼容 Adv(image/name/url) 与 ShuApp(icon/name/url) 字段
AdsInfoModel.fromJson(dynamic json) { AdsInfoModel.fromJson(dynamic json) {
json ??= {}; json ??= {};
-17
View File
@@ -1,5 +1,4 @@
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/im_manager/im_manager.dart';
/// 用户信息 /// 用户信息
class UserInfoModel { class UserInfoModel {
@@ -52,11 +51,6 @@ class UserInfoModel {
// —— 状态 / 权限 —— // —— 状态 / 权限 ——
int? adverAbTestShowType; // 广告AB -1-首次进app免广告 0-全部展示 其他N-注册后N分钟内免广告(分层后固定不变) int? adverAbTestShowType; // 广告AB -1-首次进app免广告 0-全部展示 其他N-注册后N分钟内免广告(分层后固定不变)
// —— IM 私信 ——
String? imToken; // IM SDK 登录令牌
int? imUserId; // IM 用户 id
int? sendMsgPrice; // 私信消费金币
// ============ 计算属性 ============ // ============ 计算属性 ============
/// 观影券总数量 /// 观影券总数量
@@ -127,17 +121,6 @@ class UserInfoModel {
level = map['level']; level = map['level'];
adverAbTestShowType = map['adverAbTestShowType']; adverAbTestShowType = map['adverAbTestShowType'];
imToken = map['imToken'];
imUserId = map['imUserId'];
sendMsgPrice = map['sendMsgPrice'];
// IM SDK 连接配置随登录返回,写入 ImManager 供初始化使用
if (map['socketURL']?.toString().isNotEmpty == true) {
ImManager().socketURL = map['socketURL'];
}
if (map['dynamicConfigDomain']?.toString().isNotEmpty == true) {
ImManager().dynamicConfigDomain = map['dynamicConfigDomain'];
}
} }
} }
+1 -11
View File
@@ -5,7 +5,6 @@ import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/widget/keep_alive_widget.dart'; import 'package:jydj/tools_base/widget/keep_alive_widget.dart';
import '../../hj_utils/holiday_theme.dart';
import '../../hj_utils/widget_util.dart'; import '../../hj_utils/widget_util.dart';
import 'ai_home_logic.dart'; import 'ai_home_logic.dart';
import 'ai_record/ai_main_record_page.dart'; import 'ai_record/ai_main_record_page.dart';
@@ -21,20 +20,11 @@ class AiHomePage extends StatelessWidget {
builder: (logic) { builder: (logic) {
return Stack( return Stack(
children: [ children: [
if (holidayTheme.openHoliday) ...[
Container(color: AppColors.primaryColor),
Positioned(
top: 0,
left: 0,
right: 0,
child: Image.asset(HolidayTheme.theme.mainBg, fit: BoxFit.fitWidth),
),
],
Scaffold( Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
appBar: AppBar( appBar: AppBar(
title: Text('AI科技'), title: Text('AI科技'),
backgroundColor: holidayTheme.openHoliday ? Colors.transparent : AppColors.primaryColor, backgroundColor: AppColors.primaryColor,
actions: [ actions: [
Center( Center(
child: InkWell( child: InkWell(
+1 -2
View File
@@ -124,8 +124,7 @@ class AIModDetailPage extends StatelessWidget {
'''1. 选择一张人脸清晰,不得有任何遮挡的照片上传(注意:只含一个人物和脸部,图片不能过暗) '''1. 选择一张人脸清晰,不得有任何遮挡的照片上传(注意:只含一个人物和脸部,图片不能过暗)
2. 选择一个心仪的视频或图片模板,点击生成,生成时间需要3-5分钟,耐心等待。(图片模板可自行上传) 2. 选择一个心仪的视频或图片模板,点击生成,生成时间需要3-5分钟,耐心等待。(图片模板可自行上传)
3. 在右上角记录查看生成进度,生成成功后可以点击进行下载,也可以在线观看。 3. 在右上角记录查看生成进度,生成成功后可以点击进行下载,也可以在线观看。
4. 按照上方操作,有问题随时联系在线客服进行处理。 4. 不支持多人图片,禁止未成年人图片''',
5. 不支持多人图片,禁止未成年人图片''',
style: TextStyle( style: TextStyle(
color: Color(0xff656565), color: Color(0xff656565),
fontSize: 12, fontSize: 12,
@@ -167,7 +167,7 @@ class AIStripSubPage extends StatelessWidget {
indicatorStyle: IndicatorStyle.dot, indicatorStyle: IndicatorStyle.dot,
onTap: (index) { onTap: (index) {
final ad = (logic.modList!.aiUndressMod ?? [])[index]; final ad = (logic.modList!.aiUndressMod ?? [])[index];
pushToPageByLink(ad.href, id: ad.id); pushToPageByLink(ad.href);
}, },
), ),
); );
-26
View File
@@ -1,8 +1,5 @@
import 'package:easy_rich_text/easy_rich_text.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/hj_utils/api_service/ai_service.dart'; import 'package:jydj/hj_utils/api_service/ai_service.dart';
import 'package:jydj/routers/jump_router.dart'; import 'package:jydj/routers/jump_router.dart';
import 'package:jydj/tools_base/debug_log.dart'; import 'package:jydj/tools_base/debug_log.dart';
@@ -26,20 +23,11 @@ class AIGirlSheet extends StatefulWidget {
class _AIGirlSheetState extends State<AIGirlSheet> { class _AIGirlSheetState extends State<AIGirlSheet> {
int selectIndex = 0; int selectIndex = 0;
//TapGestureRecognizer 必须自己释放,建一次复用,别在 build 里 new
final _serviceTap = TapGestureRecognizer()..onTap = pushToCustomService;
List<AIGirlFriendCurrency> get _items => widget.list ?? []; List<AIGirlFriendCurrency> get _items => widget.list ?? [];
//列表可能为空,取不到就没得选 //列表可能为空,取不到就没得选
AIGirlFriendCurrency? get _selected => selectIndex < _items.length ? _items[selectIndex] : null; AIGirlFriendCurrency? get _selected => selectIndex < _items.length ? _items[selectIndex] : null;
@override
void dispose() {
_serviceTap.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Material( return Material(
@@ -107,20 +95,6 @@ class _AIGirlSheetState extends State<AIGirlSheet> {
), ),
), ),
), ),
const SizedBox(height: 18),
EasyRichText(
'支付中如有问题 请联系在线客服',
textAlign: TextAlign.center,
defaultStyle: textStyle(12, Colors.white.withValues(alpha: .6), FontWeight.w400),
patternList: [
EasyRichTextPattern(
targetString: '在线客服',
matchOption: 'first',
style: const TextStyle(color: AppColors.primaryHighColor),
recognizer: _serviceTap,
),
],
),
const SizedBox(height: 30), const SizedBox(height: 30),
], ],
), ),
@@ -7,7 +7,6 @@ import 'package:jydj/tools_base/toast.dart';
import 'package:jydj/tools_base/video_download/video_cache_store.dart'; import 'package:jydj/tools_base/video_download/video_cache_store.dart';
import 'package:jydj/tools_base/video_download/video_download_manager.dart'; import 'package:jydj/tools_base/video_download/video_download_manager.dart';
import 'package:jydj/tools_base/widget/image_browser_page.dart'; import 'package:jydj/tools_base/widget/image_browser_page.dart';
import 'package:permission_handler/permission_handler.dart';
import '../../video/simple_video_player_page.dart'; import '../../video/simple_video_player_page.dart';
import '../ai_sub_type/ai_function_logic.dart'; import '../ai_sub_type/ai_function_logic.dart';
@@ -145,12 +144,6 @@ class AIImageRecord extends StatelessWidget {
await VideoCacheStore.instance.saveVideoInfo(MediaStyle.Video, viewModel); await VideoCacheStore.instance.saveVideoInfo(MediaStyle.Video, viewModel);
} }
Future<bool> _checkPermission() async {
var status = await Permission.storage.status;
if (!status.isGranted) status = await Permission.storage.request();
return status.isGranted;
}
//视频换脸的结果位单独接播放器,链接由 VideoModel 拼(和 AiRecordModel.realVideoUrl 的 query 不一样) //视频换脸的结果位单独接播放器,链接由 VideoModel 拼(和 AiRecordModel.realVideoUrl 的 query 不一样)
void _playResultVideo() { void _playResultVideo() {
final videoModel = VideoModel()..sourceURL = model.url; final videoModel = VideoModel()..sourceURL = model.url;
@@ -67,7 +67,7 @@ class _AudioPlayerContentState extends State<AudioPlayerContent> {
18.sizeBoxH, 18.sizeBoxH,
_progressRow(audioValue, progress, max), _progressRow(audioValue, progress, max),
14.sizeBoxH, 14.sizeBoxH,
_controlRow(audioValue, progress), _controlRow(audioValue),
18.sizeBoxH, 18.sizeBoxH,
], ],
); );
@@ -142,7 +142,7 @@ class _AudioPlayerContentState extends State<AudioPlayerContent> {
} }
// 控制行:循环模式、上一集/播放暂停/下一集、播放列表 // 控制行:循环模式、上一集/播放暂停/下一集、播放列表
Widget _controlRow(AudioPlayerValue audioValue, double progress) { Widget _controlRow(AudioPlayerValue audioValue) {
final isLoop = playMod == AudioPlayMod.loop; final isLoop = playMod == AudioPlayMod.loop;
final isPlaying = audioValue.isPlaying ?? false; final isPlaying = audioValue.isPlaying ?? false;
return Row( return Row(
@@ -179,7 +179,7 @@ class _AudioPlayerContentState extends State<AudioPlayerContent> {
children: [ children: [
InkWell( InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () => manager.playForward(progress), onTap: () => manager.playForward(),
child: Image.asset('forward.png'.acgImgPath, width: 24), child: Image.asset('forward.png'.acgImgPath, width: 24),
), ),
40.sizeBoxW, 40.sizeBoxW,
@@ -199,7 +199,7 @@ class _AudioPlayerContentState extends State<AudioPlayerContent> {
40.sizeBoxW, 40.sizeBoxW,
InkWell( InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () => manager.playNext(progress), onTap: () => manager.playNext(),
child: Image.asset('next.png'.acgImgPath, width: 24), child: Image.asset('next.png'.acgImgPath, width: 24),
), ),
], ],
+7 -39
View File
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:analytics_sdk/enum/read_behavior_enum.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/hj_model/media_content.dart'; import 'package:jydj/hj_model/media_content.dart';
@@ -8,7 +7,6 @@ import 'package:jydj/tools_base/toast.dart';
import 'package:jydj/tools_base/widget/scroll_positioned_list/src/item_positions_listener.dart'; import 'package:jydj/tools_base/widget/scroll_positioned_list/src/item_positions_listener.dart';
import 'package:jydj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart'; import 'package:jydj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart';
import '../../track_event_manager/track_manager.dart';
import 'widget/acg_source_manager.dart'; import 'widget/acg_source_manager.dart';
class CartoonReadLogic extends GetxController { class CartoonReadLogic extends GetxController {
@@ -21,7 +19,6 @@ class CartoonReadLogic extends GetxController {
bool showProgress = false; // 展示进度 bool showProgress = false; // 展示进度
bool sortType = true; // 排序类型 true-正序 false-倒序 bool sortType = true; // 排序类型 true-正序 false-倒序
bool autoPlay = false; // 是否自动播放 bool autoPlay = false; // 是否自动播放
bool playFinish = false; // 是否触底播放完成
double readScale = 0; // 播放比例 double readScale = 0; // 播放比例
double bottomHeight = 155; double bottomHeight = 155;
int animationTime = 250; // 显示时间(ms) int animationTime = 250; // 显示时间(ms)
@@ -74,7 +71,7 @@ class CartoonReadLogic extends GetxController {
showToast('这是最后一${manager.mediaInfo?.unit}了喔~'); showToast('这是最后一${manager.mediaInfo?.unit}了喔~');
return; return;
} }
_openEpisode(index, behavior: next ? ReadBehaviorEnum.PAGE_NEXT : ReadBehaviorEnum.PAGE_PREV); _openEpisode(index);
} }
// 目录点击切章 // 目录点击切章
@@ -105,7 +102,7 @@ class CartoonReadLogic extends GetxController {
// 松手:jumpTo 的位置回调下一帧才到,延后一帧再放开 // 松手:jumpTo 的位置回调下一帧才到,延后一帧再放开
void onSeekEnd(double value) { void onSeekEnd(double value) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
// 拖动期间位置回调被屏蔽,松手补一次触底结算,别把「读完」埋点漏了; // 拖动期间位置回调被屏蔽,松手补一次触底结算(停自动播放);
// 放在解锁之前,免得这一步引起的滚动又被 onScrollAction 收了菜单 // 放在解锁之前,免得这一步引起的滚动又被 onScrollAction 收了菜单
_checkReachBottom(); _checkReachBottom();
_isSeeking = false; _isSeeking = false;
@@ -155,9 +152,9 @@ class CartoonReadLogic extends GetxController {
} }
// ========== 私有方法 ========== // ========== 私有方法 ==========
/// 切章统一入口:权限/缓存都在 manager 里,这里只管埋点顺序和刷新 /// 切章统一入口:权限/缓存都在 manager 里,这里只管状态重置和刷新
/// [behavior] 非空则先补一条翻页行为(用旧章数据),[isFirstLoad] 失败时才进错误页 /// [isFirstLoad] 失败时才进错误页
Future<void> _openEpisode(int index, {ReadBehaviorEnum? behavior, bool isFirstLoad = false}) async { Future<void> _openEpisode(int index, {bool isFirstLoad = false}) async {
// 首次进入页面已有全屏 loading,不再叠遮罩 // 首次进入页面已有全屏 loading,不再叠遮罩
final model = await manager.getComicsMediaContent(index: index, showLoading: !isFirstLoad); final model = await manager.getComicsMediaContent(index: index, showLoading: !isFirstLoad);
if (model == null) { if (model == null) {
@@ -165,29 +162,10 @@ class CartoonReadLogic extends GetxController {
update(); update();
return; return;
} }
// 上下翻页,先上传切换行为(旧章的进度和集号),再上传展示行为
if (behavior != null) {
TrackVideoManager.comicEvent(
behavior,
model: manager.mediaInfo,
readProgress: (readScale * 100).floor(),
pageNo: currentEpisode + 1,
mediaContent: detailInfo,
);
}
currentEpisode = index; currentEpisode = index;
detailInfo = model; detailInfo = model;
readIndex = 0; readIndex = 0;
readScale = 0; readScale = 0;
playFinish = false; // 重置播放完成状态
// 漫画展示
TrackVideoManager.comicEvent(
ReadBehaviorEnum.VIEW,
model: manager.mediaInfo,
readProgress: 0,
pageNo: currentEpisode + 1,
mediaContent: model,
);
update(); update();
// 首次加载时列表还没 build,controller 未 attach,跳转会空断言崩 // 首次加载时列表还没 build,controller 未 attach,跳转会空断言崩
if (itemScrollCtr.isAttached) itemScrollCtr.jumpTo(index: 0); if (itemScrollCtr.isAttached) itemScrollCtr.jumpTo(index: 0);
@@ -205,24 +183,14 @@ class CartoonReadLogic extends GetxController {
update(['slider']); update(['slider']);
} }
// 触底:停自动播放(顺带弹回菜单)+ 上报读完 // 触底:停自动播放(顺带弹回菜单)
void _checkReachBottom() { void _checkReachBottom() {
final positions = itemListener.itemPositions.value; final positions = itemListener.itemPositions.value;
if (positions.isEmpty) return; if (positions.isEmpty) return;
final count = detailInfo?.urlSet?.length ?? 0; final count = detailInfo?.urlSet?.length ?? 0;
// 首图还在视野内就不算触底(整章不足一屏时不上报读完) // 首图还在视野内就不算触底(整章不足一屏时不处理)
if (positions.first.index == 0 || positions.last.index != count - 1) return; if (positions.first.index == 0 || positions.last.index != count - 1) return;
onChangeAutoPlay(false); onChangeAutoPlay(false);
// 播放完毕只记录一次
if (playFinish) return;
playFinish = true;
TrackVideoManager.comicEvent(
ReadBehaviorEnum.COMPLETE,
model: manager.mediaInfo,
readProgress: 100,
pageNo: manager.index + 1,
mediaContent: detailInfo,
);
} }
void _startTimer() { void _startTimer() {
@@ -21,6 +21,6 @@ class CartoonSubDetailPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return CartoonSubGridPage(tagData: tagData, type: type, scrollCtr: scroll, tabIndex: index).keepAlive; return CartoonSubGridPage(tagData: tagData, type: type, scrollCtr: scroll).keepAlive;
} }
} }
@@ -5,8 +5,6 @@ import 'package:jydj/hj_utils/api_service/vid_service.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/tools_base/base_list_controller.dart'; import 'package:jydj/tools_base/base_list_controller.dart';
import '../../track_event_manager/track_manager.dart';
class CartoonSubGridLogic extends ListBaseLogic { class CartoonSubGridLogic extends ListBaseLogic {
final MediaStyle type; //-1:动漫和漫画 0:图集 1:黄游 2:小说 final MediaStyle type; //-1:动漫和漫画 0:图集 1:黄游 2:小说
final ModuleData? tagData; //模块model final ModuleData? tagData; //模块model
@@ -30,14 +28,6 @@ class CartoonSubGridLogic extends ListBaseLogic {
return 1; return 1;
} }
TrackEventPageType get pageType {
if (type == MediaStyle.Cartoon) return TrackEventPageType.home;
if (type == MediaStyle.Pic) return TrackEventPageType.commImg;
if (type == MediaStyle.Game) return TrackEventPageType.commNovel;
if (type == MediaStyle.Novel) return TrackEventPageType.commNovel;
return TrackEventPageType.home;
}
String get newsType { String get newsType {
if (tagData?.moduleName == '热门推荐' && tagData?.type == -100) return 'PIC'; if (tagData?.moduleName == '热门推荐' && tagData?.type == -100) return 'PIC';
if (tagData?.moduleName == '热门推荐' && tagData?.type == -101) return 'SEED_LINK'; if (tagData?.moduleName == '热门推荐' && tagData?.type == -101) return 'SEED_LINK';
@@ -7,7 +7,6 @@ import 'package:jydj/hj_utils/sliver_delegate.dart';
import 'package:jydj/tools_base/banner/ads_grid_view.dart'; import 'package:jydj/tools_base/banner/ads_grid_view.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/refresh/pull_refresh.dart'; import 'package:jydj/tools_base/refresh/pull_refresh.dart';
import 'package:jydj/track_event_manager/track_manager.dart';
import '../home/home_cell_style/quick_entry_row.dart'; import '../home/home_cell_style/quick_entry_row.dart';
import '../home/home_cell_style/video_simple_cell.dart'; import '../home/home_cell_style/video_simple_cell.dart';
@@ -21,14 +20,12 @@ class CartoonSubGridPage extends StatelessWidget {
final ModuleData? tagData; //模块model final ModuleData? tagData; //模块model
final MediaStyle type; //-1:动漫和漫画 0:图集 1:黄游 2:小说 final MediaStyle type; //-1:动漫和漫画 0:图集 1:黄游 2:小说
final ScrollController? scrollCtr; final ScrollController? scrollCtr;
final int tabIndex; //所属 tab 下标,只用于广告曝光埋点
const CartoonSubGridPage({ const CartoonSubGridPage({
super.key, super.key,
this.tagData, this.tagData,
this.type = MediaStyle.Pic, this.type = MediaStyle.Pic,
this.scrollCtr, this.scrollCtr,
this.tabIndex = 0,
}); });
// 多 type/模块 tab 经 keepAlive 并存,按 id+type 隔离各自的 logic // 多 type/模块 tab 经 keepAlive 并存,按 id+type 隔离各自的 logic
@@ -58,7 +55,6 @@ class CartoonSubGridPage extends StatelessWidget {
type == MediaStyle.Cartoon ? 4 : 7, //广告位标识 type == MediaStyle.Cartoon ? 4 : 7, //广告位标识
padding: const EdgeInsets.fromLTRB(16, 0, 16, 12), padding: const EdgeInsets.fromLTRB(16, 0, 16, 12),
autoStyle: true, autoStyle: true,
exposureModel: AdExposureModel(pageType: logic.pageType, tabIndex: tabIndex),
), ),
), ),
// 这两块只有动漫/漫画有 // 这两块只有动漫/漫画有
@@ -139,7 +135,6 @@ class CartoonSubGridPage extends StatelessWidget {
videoModel: list[index], videoModel: list[index],
isFromHY: true, isFromHY: true,
textLines: 1, textLines: 1,
exposureModel: AdExposureModel(pageType: TrackEventPageType.acgHome),
), ),
_ => const SizedBox.shrink(), _ => const SizedBox.shrink(),
}, },
@@ -1,4 +1,3 @@
import 'package:analytics_sdk/enum/read_behavior_enum.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/hj_model/media_content.dart'; import 'package:jydj/hj_model/media_content.dart';
@@ -8,7 +7,6 @@ import 'package:jydj/tools_base/toast.dart';
import '../../hj_model/acg/comic_chapters_model.dart'; import '../../hj_model/acg/comic_chapters_model.dart';
import '../../hj_model/cartoon_media_info.dart'; import '../../hj_model/cartoon_media_info.dart';
import '../../tools_base/loading/loading_helper.dart'; import '../../tools_base/loading/loading_helper.dart';
import '../../track_event_manager/track_manager.dart';
import 'widget/acg_source_manager.dart'; import 'widget/acg_source_manager.dart';
// 文字小说阅读 logic // 文字小说阅读 logic
@@ -23,10 +21,7 @@ class TextNovelReadLogic extends GetxController {
bool showMenu = true; bool showMenu = true;
bool isDark = true; bool isDark = true;
bool isAscend = true; // 排序类型 true-正序 false-倒序 bool isAscend = true; // 排序类型 true-正序 false-倒序
bool playFinish = false; // 是否触底播放完成
bool isSwitching = false; // 是否正在切换集,避免竞态
int durationTime = 250; int durationTime = 250;
int progress = 0; // 0 ~ 100
final ScrollController scrollCtr = ScrollController(); final ScrollController scrollCtr = ScrollController();
@@ -37,7 +32,6 @@ class TextNovelReadLogic extends GetxController {
super.onInit(); super.onInit();
mediaInfo = manager.mediaInfo; mediaInfo = manager.mediaInfo;
currentEpisode = manager.index; currentEpisode = manager.index;
scrollCtr.addListener(_onScroll);
} }
@override @override
@@ -49,7 +43,6 @@ class TextNovelReadLogic extends GetxController {
@override @override
void onClose() { void onClose() {
scrollCtr.removeListener(_onScroll);
scrollCtr.dispose(); scrollCtr.dispose();
super.onClose(); super.onClose();
} }
@@ -68,9 +61,7 @@ class TextNovelReadLogic extends GetxController {
// true 下一集 / false 上一集 // true 下一集 / false 上一集
void loadOtherEpisode(bool next, {bool showLoading = false}) async { void loadOtherEpisode(bool next, {bool showLoading = false}) async {
isSwitching = true;
final index = next ? currentEpisode + 1 : currentEpisode - 1; final index = next ? currentEpisode + 1 : currentEpisode - 1;
final pageNo = next ? index : currentEpisode + 1;
if (index < 0) { if (index < 0) {
showToast('这是第一${mediaInfo?.unit}了喔~'); showToast('这是第一${mediaInfo?.unit}了喔~');
return; return;
@@ -81,14 +72,6 @@ class TextNovelReadLogic extends GetxController {
} }
final model = await manager.getComicsMediaContent(index: index); final model = await manager.getComicsMediaContent(index: index);
if (model == null) return; if (model == null) return;
TrackVideoManager.novelEvent(
next ? ReadBehaviorEnum.PAGE_NEXT : ReadBehaviorEnum.PAGE_PREV,
model: manager.mediaInfo,
readProgress: progress,
pageNo: pageNo,
chapterId: detailInfo?.id,
chapterName: detailInfo?.name,
);
currentEpisode = index; currentEpisode = index;
_setData(model); _setData(model);
update(); update();
@@ -138,19 +121,8 @@ class TextNovelReadLogic extends GetxController {
void _setData(MediaContent? model) { void _setData(MediaContent? model) {
if (model != null) { if (model != null) {
detailInfo = model; detailInfo = model;
playFinish = false;
progress = 0;
manager.changeEpisodesIndex((model.episodeNumber ?? 1) - 1); manager.changeEpisodesIndex((model.episodeNumber ?? 1) - 1);
update(); update();
// 小说展示
TrackVideoManager.novelEvent(
ReadBehaviorEnum.VIEW,
model: manager.mediaInfo,
readProgress: progress,
pageNo: manager.index + 1,
chapterId: model.id,
chapterName: model.name,
);
} else { } else {
detailInfo = MediaContent(); detailInfo = MediaContent();
} }
@@ -160,26 +132,6 @@ class TextNovelReadLogic extends GetxController {
void _toTop() { void _toTop() {
Future.delayed(const Duration(milliseconds: 100)).then((_) { Future.delayed(const Duration(milliseconds: 100)).then((_) {
scrollCtr.jumpTo(0); scrollCtr.jumpTo(0);
isSwitching = false;
}); });
} }
void _onScroll() {
if (!scrollCtr.hasClients) return;
final position = scrollCtr.position;
final max = position.maxScrollExtent;
final current = position.pixels;
progress = max > 0 ? ((current / max).clamp(0.0, 1.0) * 100).round() : 0;
if (current >= max - 20 && !playFinish && !isSwitching) {
playFinish = true;
TrackVideoManager.novelEvent(
ReadBehaviorEnum.COMPLETE,
model: manager.mediaInfo,
readProgress: progress,
pageNo: manager.index + 1,
chapterId: detailInfo?.id,
chapterName: detailInfo?.name,
);
}
}
} }
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:analytics_sdk/enum/read_behavior_enum.dart';
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -17,7 +16,6 @@ import '../../../alert/video/vip_acg_dialog.dart';
import '../../../hj_model/acg/comic_chapters_model.dart'; import '../../../hj_model/acg/comic_chapters_model.dart';
import '../../../hj_utils/api_service/acg_service.dart'; import '../../../hj_utils/api_service/acg_service.dart';
import '../../../tools_base/global_store/store.dart'; import '../../../tools_base/global_store/store.dart';
import '../../../track_event_manager/track_manager.dart';
/// 小说/漫画/有声资源管理器 /// 小说/漫画/有声资源管理器
class ACGSourceManager extends ChangeNotifier { class ACGSourceManager extends ChangeNotifier {
@@ -245,14 +243,6 @@ class AudioPlayerManager {
double playSpeed = 1; double playSpeed = 1;
ComicChapterInfo? _currentEpisode() {
final manager = sourceManger;
if (manager == null || manager.index < 0 || manager.index >= manager.allEpisodes.length) {
return null;
}
return manager.allEpisodes[manager.index];
}
void initPlayer() { void initPlayer() {
if (_audioPlayer != null) return; // 防重入:已初始化则跳过,避免 5 个 stream 监听重复注册、旧 sub 泄漏 if (_audioPlayer != null) return; // 防重入:已初始化则跳过,避免 5 个 stream 监听重复注册、旧 sub 泄漏
_audioPlayer = AudioPlayer(); _audioPlayer = AudioPlayer();
@@ -290,15 +280,7 @@ class AudioPlayerManager {
_audioCompleSub = _audioPlayer?.onPlayerComplete.listen((event) { _audioCompleSub = _audioPlayer?.onPlayerComplete.listen((event) {
if (playMod == AudioPlayMod.loopList && (value.isPlaying ?? false)) { if (playMod == AudioPlayMod.loopList && (value.isPlaying ?? false)) {
audioValue.value = AudioPlayerValue.copyWith(value..isPlaying = false); audioValue.value = AudioPlayerValue.copyWith(value..isPlaying = false);
TrackVideoManager.novelEvent( playNext();
ReadBehaviorEnum.COMPLETE,
model: sourceManger?.mediaInfo,
readProgress: 100,
pageNo: (sourceManger?.index ?? 0) + 1,
chapterId: _currentEpisode()?.id,
chapterName: _currentEpisode()?.name,
);
playNext(0);
} else { } else {
audioValue.value = AudioPlayerValue.copyWith(value audioValue.value = AudioPlayerValue.copyWith(value
..isCompleted = true ..isCompleted = true
@@ -340,30 +322,12 @@ class AudioPlayerManager {
..duration = null); ..duration = null);
showToast('音频加载失败'); showToast('音频加载失败');
}); });
if (sourceManger?.mediaInfo != null) {
TrackVideoManager.novelEvent(
ReadBehaviorEnum.VIEW,
model: sourceManger?.mediaInfo,
readProgress: 0,
pageNo: (sourceManger?.index ?? 0) + 1,
chapterId: _currentEpisode()?.id,
chapterName: _currentEpisode()?.name,
);
}
} }
/// 上一集 /// 上一集
Future<void> playForward(double progress) async { Future<void> playForward() async {
final epm = await sourceManger?.backToForward(); final epm = await sourceManger?.backToForward();
if (epm != null) { if (epm != null) {
TrackVideoManager.novelEvent(
ReadBehaviorEnum.PAGE_PREV,
model: sourceManger?.mediaInfo,
readProgress: (progress * 100).round(),
pageNo: (sourceManger?.index ?? 0) + 2,
chapterId: epm.id,
chapterName: epm.name,
);
play(epm.getRealAudioUrl); play(epm.getRealAudioUrl);
} else { } else {
pause(); pause();
@@ -371,17 +335,9 @@ class AudioPlayerManager {
} }
/// 下一集 /// 下一集
Future<void> playNext(double progress) async { Future<void> playNext() async {
final epm = await sourceManger?.jumpToNext(); final epm = await sourceManger?.jumpToNext();
if (epm != null) { if (epm != null) {
TrackVideoManager.novelEvent(
ReadBehaviorEnum.PAGE_NEXT,
model: sourceManger?.mediaInfo,
readProgress: (progress * 100).round(),
pageNo: sourceManger?.index ?? 0,
chapterId: epm.id,
chapterName: epm.name,
);
play(epm.getRealAudioUrl); play(epm.getRealAudioUrl);
} else { } else {
pause(); pause();
@@ -26,7 +26,7 @@ class CommentRichText extends StatelessWidget {
if (i != parts.length - 1) if (i != parts.length - 1)
WidgetSpan( WidgetSpan(
child: GestureDetector( child: GestureDetector(
onTap: () => pushToPageByLink(model?.linkStr, id: model?.id), onTap: () => pushToPageByLink(model?.linkStr),
child: Text( child: Text(
keyword, keyword,
style: const TextStyle(color: Color(0xffF68804), fontSize: 14, height: 1.2), style: const TextStyle(color: Color(0xffF68804), fontSize: 14, height: 1.2),
@@ -11,7 +11,6 @@ import '../../../hj_model/home/plate_model.dart';
import '../../../hj_model/video_model.dart'; import '../../../hj_model/video_model.dart';
import '../../../hj_utils/sliver_delegate.dart'; import '../../../hj_utils/sliver_delegate.dart';
import '../../../tools_base/widget/net_image_widget.dart'; import '../../../tools_base/widget/net_image_widget.dart';
import '../../../track_event_manager/track_manager.dart';
import '../widget/community_middle_header.dart'; import '../widget/community_middle_header.dart';
import '../widget/community_post_widget.dart'; import '../widget/community_post_widget.dart';
import 'community_tab_logic.dart'; import 'community_tab_logic.dart';
@@ -48,10 +47,6 @@ class CommunityTabPage extends StatelessWidget {
7, 7,
autoStyle: true, autoStyle: true,
padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 10.h), padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 10.h),
exposureModel: AdExposureModel(
pageType: TrackEventPageType.commPost,
tabIndex: index,
),
), ),
), ),
SliverToBoxAdapter( SliverToBoxAdapter(
@@ -16,19 +16,16 @@ class CommunityMainLogic extends GetxController with GetTickerProviderStateMixin
title: '社区', title: '社区',
imageNor: 'community_main_sel.png'.communityPath, imageNor: 'community_main_sel.png'.communityPath,
imageSel: 'community_main_sel.png'.communityPath, imageSel: 'community_main_sel.png'.communityPath,
trackKey: 'Community',
), ),
MainTabModel( MainTabModel(
title: '色图', title: '色图',
imageNor: 'community_pic_sel.png'.communityPath, imageNor: 'community_pic_sel.png'.communityPath,
imageSel: 'community_pic_sel.png'.communityPath, imageSel: 'community_pic_sel.png'.communityPath,
trackKey: 'Pic',
), ),
MainTabModel( MainTabModel(
title: '小说', title: '小说',
imageNor: 'community_noval_sel.png'.communityPath, imageNor: 'community_noval_sel.png'.communityPath,
imageSel: 'community_noval_sel.png'.communityPath, imageSel: 'community_noval_sel.png'.communityPath,
trackKey: 'Novel',
), ),
]; ];
@@ -2,11 +2,9 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/widget/keep_alive_widget.dart'; import 'package:jydj/tools_base/widget/keep_alive_widget.dart';
import '../../../assets_tool/app_colors.dart';
import '../../../config/config.dart'; import '../../../config/config.dart';
import '../../cartoon/cartoon_sub_module_page.dart'; import '../../cartoon/cartoon_sub_module_page.dart';
import '../../home/search_page/search_main_page.dart'; import '../../home/search_page/search_main_page.dart';
@@ -48,15 +46,6 @@ class CommunityMainPageState extends State<CommunityMainPage> with SingleTickerP
return Stack( return Stack(
fit: StackFit.expand, fit: StackFit.expand,
children: [ children: [
if (holidayTheme.openHoliday) ...[
Container(color: AppColors.primaryColor),
Positioned(
top: 0,
left: 0,
right: 0,
child: Image.asset(HolidayTheme.theme.findBg, fit: BoxFit.fitWidth),
),
],
Scaffold( Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: GetBuilder( body: GetBuilder(
@@ -6,7 +6,6 @@ import 'package:jydj/tools_base/banner/ads_grid_view.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/refresh/pull_refresh.dart'; import 'package:jydj/tools_base/refresh/pull_refresh.dart';
import '../../../track_event_manager/track_manager.dart';
import 'group_chat_logic.dart'; import 'group_chat_logic.dart';
import 'widget/chat_group_cell.dart'; import 'widget/chat_group_cell.dart';
@@ -31,9 +30,6 @@ class GroupChatPage extends StatelessWidget {
6, 6,
autoStyle: true, autoStyle: true,
padding: EdgeInsets.fromLTRB(16, 12, 16, 18), padding: EdgeInsets.fromLTRB(16, 12, 16, 18),
exposureModel: AdExposureModel(
pageType: TrackEventPageType.commGroup,
),
), ),
), ),
if (logic.groupList == null) if (logic.groupList == null)
@@ -10,7 +10,6 @@ import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/refresh/pull_refresh.dart'; import 'package:jydj/tools_base/refresh/pull_refresh.dart';
import 'package:jydj/tools_base/unique_tag_mixin.dart'; import 'package:jydj/tools_base/unique_tag_mixin.dart';
import '../../../track_event_manager/track_manager.dart';
import '../../comment/widget/comment_foot_view.dart'; import '../../comment/widget/comment_foot_view.dart';
import '../../home/widget/quick_search_view.dart'; import '../../home/widget/quick_search_view.dart';
import '../widget/post_user_info_view.dart'; import '../widget/post_user_info_view.dart';
@@ -89,7 +88,6 @@ class _PostDetailPageState extends State<PostDetailPage> with UniqueTagMixin {
child: AdsGridView( child: AdsGridView(
7, 7,
autoStyle: true, autoStyle: true,
exposureModel: AdExposureModel(pageType: TrackEventPageType.postDetail),
), ),
), ),
//评论数 + 快捷搜索词 //评论数 + 快捷搜索词
@@ -1,17 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:jydj/assets_tool/app_colors.dart'; import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
class CommunitySortHeader extends StatefulWidget { class CommunitySortHeader extends StatefulWidget {
final Function(int sort) sortOnTap; final Function(int sort) sortOnTap;
final TabController? controller; final TabController? controller;
final bool isInTop; //吸顶时才在节日主题下叠渐变底
const CommunitySortHeader({ const CommunitySortHeader({
super.key, super.key,
required this.sortOnTap, required this.sortOnTap,
this.controller, this.controller,
this.isInTop = false,
}); });
@override @override
@@ -44,16 +41,6 @@ class _CommunitySortHeaderState extends State<CommunitySortHeader> with SingleTi
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.primaryColor, color: AppColors.primaryColor,
gradient: (widget.isInTop && holidayTheme.openHoliday)
? LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xff3e161c),
Color(0xff26161c),
],
)
: null,
), ),
child: TabBar( child: TabBar(
isScrollable: true, isScrollable: true,
-1
View File
@@ -1,5 +1,4 @@
import 'package:jydj/hj_model/drama/drama_models.dart'; import 'package:jydj/hj_model/drama/drama_models.dart';
import 'package:jydj/hj_model/video_model.dart';
import 'package:jydj/hj_utils/api_service/drama_service.dart'; import 'package:jydj/hj_utils/api_service/drama_service.dart';
import 'package:jydj/tools_base/base_list_controller.dart'; import 'package:jydj/tools_base/base_list_controller.dart';
-6
View File
@@ -1,8 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_model/video_model.dart';
import 'package:jydj/hj_page/drama/drama_detail_page.dart';
import 'package:jydj/hj_page/drama/drama_list_logic.dart'; import 'package:jydj/hj_page/drama/drama_list_logic.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/refresh/pull_refresh.dart'; import 'package:jydj/tools_base/refresh/pull_refresh.dart';
@@ -143,10 +141,6 @@ class _DramaListPageState extends State<DramaListPage> with UniqueTagMixin {
); );
} }
void _openDrama(VideoModel model) {
Get.to(() => DramaDetailPage(drama: model.dramaInfo));
}
Widget _buildBody(DramaListLogic logic) { Widget _buildBody(DramaListLogic logic) {
if (logic.isLoading) return const LoadingCenterWidget(); if (logic.isLoading) return const LoadingCenterWidget();
if (logic.isEmptyData) return CErrorWidget(retryOnTap: () => logic.loadData()); if (logic.isEmptyData) return CErrorWidget(retryOnTap: () => logic.loadData());
@@ -1,4 +1,3 @@
import 'package:jydj/hj_model/video_model.dart';
import 'package:jydj/hj_utils/api_service/drama_service.dart'; import 'package:jydj/hj_utils/api_service/drama_service.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/tools_base/base_list_controller.dart'; import 'package:jydj/tools_base/base_list_controller.dart';
@@ -1,9 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/hj_model/video_model.dart'; import 'package:jydj/hj_model/video_model.dart';
import 'package:jydj/hj_page/drama/drama_detail_page.dart';
import 'package:jydj/hj_page/drama/drama_tag_detail_logic.dart'; import 'package:jydj/hj_page/drama/drama_tag_detail_logic.dart';
import 'package:jydj/hj_page/home/home_cell_style/video_simple_cell.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/refresh/pull_refresh.dart'; import 'package:jydj/tools_base/refresh/pull_refresh.dart';
import 'package:jydj/tools_base/unique_tag_mixin.dart'; import 'package:jydj/tools_base/unique_tag_mixin.dart';
@@ -83,10 +81,6 @@ class _DramaTagDetailPageState extends State<DramaTagDetailPage> with UniqueTagM
); );
} }
void _openDrama(VideoModel model) {
Get.to(() => DramaDetailPage(drama: model.dramaInfo));
}
Widget _buildBody(DramaTagDetailLogic logic) { Widget _buildBody(DramaTagDetailLogic logic) {
if (logic.isLoading) return const LoadingCenterWidget(); if (logic.isLoading) return const LoadingCenterWidget();
if (logic.isEmptyData) return CErrorWidget(retryOnTap: () => logic.loadData()); if (logic.isEmptyData) return CErrorWidget(retryOnTap: () => logic.loadData());
@@ -10,7 +10,6 @@ import 'package:jydj/tools_base/widget/scroll_positioned_list/src/item_positions
import 'package:jydj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart'; import 'package:jydj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart';
import '../../../alert/video/video_buy_bottom_sheet.dart'; import '../../../alert/video/video_buy_bottom_sheet.dart';
import '../../../alert/video/vip_acg_dialog.dart';
import '../../mine/mine_vip/mine_charge_vip_page.dart'; import '../../mine/mine_vip/mine_charge_vip_page.dart';
class PicsDetailLogic extends GetxController { class PicsDetailLogic extends GetxController {
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jydj/hj_page/find/rank_module/rank_sort_tab_bar.dart'; import 'package:jydj/hj_page/find/rank_module/rank_sort_tab_bar.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/widget/keep_alive_widget.dart'; import 'package:jydj/tools_base/widget/keep_alive_widget.dart';
import 'rank_sub_page.dart'; import 'rank_sub_page.dart';
@@ -183,7 +183,7 @@ class _HomeFloatBannerState extends State<HomeFloatBanner> {
return InkWell( return InkWell(
enableFeedback: false, enableFeedback: false,
// 内链可配到会员/金币页,来源统一记首页浮窗 // 内链可配到会员/金币页,来源统一记首页浮窗
onTap: () => pushToPageByLink(_banner.url, id: _banner.id, sourcePage: PaySourcePage.homeFloatWindow), onTap: () => pushToPageByLink(_banner.url, sourcePage: PaySourcePage.homeFloatWindow),
child: SizedBox( child: SizedBox(
width: widget.width, width: widget.width,
height: widget.height, height: widget.height,
@@ -134,7 +134,6 @@ class _SwiperFloatingWidgetState extends State<SwiperFloatingWidget> {
// 内链可配到会员/金币页,来源统一记首页浮窗 // 内链可配到会员/金币页,来源统一记首页浮窗
pushToPageByLink( pushToPageByLink(
ad.url, ad.url,
id: ad.id ?? (ad.position ?? 0).toString(),
sourcePage: PaySourcePage.homeFloatWindow, sourcePage: PaySourcePage.homeFloatWindow,
); );
} }
@@ -45,7 +45,7 @@ class QuickEntryRow extends StatelessWidget {
margin: const EdgeInsets.only(right: 16), margin: const EdgeInsets.only(right: 16),
child: InkWell( child: InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () => pushToPageByLink(model.linkUrl, id: model.id), onTap: () => pushToPageByLink(model.linkUrl),
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_utils/api_service/common_service.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/routers/jump_router.dart'; import 'package:jydj/routers/jump_router.dart';
@@ -50,7 +51,8 @@ class TiktokSimpleCell extends StatelessWidget {
void _onTap() { void _onTap() {
if (videoModel?.isRandomAd() == true) { if (videoModel?.isRandomAd() == true) {
pushToPageByLink(videoModel?.randomAdsInfo?.href, id: videoModel?.randomAdsInfo?.id); pushToPageByLink(videoModel?.randomAdsInfo?.href);
CommonService.adsClick(videoModel?.randomAdsInfo?.id);
return; return;
} }
pushToVideoPage(videoModel: videoModel); pushToVideoPage(videoModel: videoModel);
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jydj/hj_utils/api_service/common_service.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import '../../../hj_model/video_model.dart'; import '../../../hj_model/video_model.dart';
@@ -76,7 +77,8 @@ class VideoHorCell extends StatelessWidget {
void _onTap() { void _onTap() {
if (videoModel?.isRandomAd() == true) { if (videoModel?.isRandomAd() == true) {
pushToPageByLink(videoModel?.randomAdsInfo?.href, id: videoModel?.randomAdsInfo?.id); pushToPageByLink(videoModel?.randomAdsInfo?.href);
CommonService.adsClick(videoModel?.randomAdsInfo?.id);
return; return;
} }
pushToVideoPage(videoModel: videoModel); pushToVideoPage(videoModel: videoModel);
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/config/config.dart'; import 'package:jydj/config/config.dart';
import 'package:jydj/extension/extensions.dart'; import 'package:jydj/extension/extensions.dart';
import 'package:jydj/hj_utils/api_service/common_service.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/routers/jump_router.dart'; import 'package:jydj/routers/jump_router.dart';
import 'package:jydj/tools_base/banner/ads_item.dart'; import 'package:jydj/tools_base/banner/ads_item.dart';
@@ -14,7 +15,6 @@ import '../../../hj_utils/free_play_manager.dart';
import '../../../tools_base/banner/ads_banner.dart'; import '../../../tools_base/banner/ads_banner.dart';
import '../../../tools_base/widget/net_image_widget.dart'; import '../../../tools_base/widget/net_image_widget.dart';
import 'level_mark_chip.dart'; import 'level_mark_chip.dart';
import '../../../track_event_manager/track_manager.dart';
/// 竖版视频 item:封面(角标/售卖标/暗网遮罩) + 标题 +(可选)标签/评论数。 /// 竖版视频 item:封面(角标/售卖标/暗网遮罩) + 标题 +(可选)标签/评论数。
/// 命中广告数据时整体换成 [VideoSimpleAdsCell] /// 命中广告数据时整体换成 [VideoSimpleAdsCell]
@@ -26,7 +26,6 @@ class VideoSimpleCell extends StatelessWidget {
final bool isFromHY; // 黄油风格 final bool isFromHY; // 黄油风格
final bool isShowBottom; // true 显示底部标签和评论数 final bool isShowBottom; // true 显示底部标签和评论数
final bool isFromSearch; final bool isFromSearch;
final AdExposureModel? exposureModel;
final double titleFontSize; // 标题字号,小卡场景传小值 final double titleFontSize; // 标题字号,小卡场景传小值
final double coverFontSize; // 封面底部播放量/时长字号,小卡场景传小值避免溢出 final double coverFontSize; // 封面底部播放量/时长字号,小卡场景传小值避免溢出
final String? coverRightText; // 封面右下角文案,默认时长;短剧传「共N集」 final String? coverRightText; // 封面右下角文案,默认时长;短剧传「共N集」
@@ -42,7 +41,6 @@ class VideoSimpleCell extends StatelessWidget {
this.isFromHY = false, this.isFromHY = false,
this.isShowBottom = false, this.isShowBottom = false,
this.isFromSearch = false, this.isFromSearch = false,
this.exposureModel,
this.titleFontSize = 12, this.titleFontSize = 12,
this.coverFontSize = 10, this.coverFontSize = 10,
this.coverRightText, this.coverRightText,
@@ -65,7 +63,6 @@ class VideoSimpleCell extends StatelessWidget {
? VideoSimpleAdsCell( ? VideoSimpleAdsCell(
videoModel: videoModel, videoModel: videoModel,
textLines: textLines, textLines: textLines,
exposureModel: exposureModel,
isShowBottom: isShowBottom, isShowBottom: isShowBottom,
) )
: _buildContent(), : _buildContent(),
@@ -74,7 +71,8 @@ class VideoSimpleCell extends StatelessWidget {
void _onTap() { void _onTap() {
if (videoModel?.isRandomAd() == true) { if (videoModel?.isRandomAd() == true) {
pushToPageByLink(videoModel?.randomAdsInfo?.href, id: videoModel?.randomAdsInfo?.id); pushToPageByLink(videoModel?.randomAdsInfo?.href);
CommonService.adsClick(videoModel?.randomAdsInfo?.id);
return; return;
} }
if (_needVipUnlock) { if (_needVipUnlock) {
@@ -279,14 +277,12 @@ class VideoSimpleCell extends StatelessWidget {
class VideoSimpleAdsCell extends StatefulWidget { class VideoSimpleAdsCell extends StatefulWidget {
final VideoModel? videoModel; final VideoModel? videoModel;
final int textLines; final int textLines;
final AdExposureModel? exposureModel;
final bool isShowBottom; final bool isShowBottom;
const VideoSimpleAdsCell({ const VideoSimpleAdsCell({
super.key, super.key,
this.videoModel, this.videoModel,
this.textLines = 2, this.textLines = 2,
this.exposureModel,
this.isShowBottom = false, this.isShowBottom = false,
}); });
@@ -303,18 +299,11 @@ class _VideoSimpleAdsCellState extends State<VideoSimpleAdsCell> {
AdsInfoModel? get adsModel => videoModel?.randomAdsInfo; AdsInfoModel? get adsModel => videoModel?.randomAdsInfo;
// 广告点击:跳落地页并带曝光埋点参数 // 广告点击:跳落地页并上报点击
void _onAdTap() { void _onAdTap() {
final ad = adsInfoArr![adIndex]; final ad = adsInfoArr![adIndex];
pushToPageByLink( pushToPageByLink(ad.href);
ad.href, CommonService.adsClick(ad.id);
id: ad.id,
arguments: {
'pageType': widget.exposureModel?.pageType,
'adInfo': ad,
'payload': {'ad_type': widget.exposureModel?.adType?.value ?? ''},
},
);
} }
@override @override
@@ -345,7 +334,6 @@ class _VideoSimpleAdsCellState extends State<VideoSimpleAdsCell> {
child: AdsBanner( child: AdsBanner(
adsInfoArr, adsInfoArr,
autoPlayMs: 3000, autoPlayMs: 3000,
exposureModel: widget.exposureModel,
borderRadius: 4, borderRadius: 4,
onIndexChanged: (index) { onIndexChanged: (index) {
adIndex = index; adIndex = index;
@@ -414,7 +402,6 @@ class _VideoSimpleAdsCellState extends State<VideoSimpleAdsCell> {
children: [ children: [
AdsItem( AdsItem(
adInfo: adModel!, adInfo: adModel!,
exposureModel: widget.exposureModel,
borderRadius: 4, borderRadius: 4,
showType: AdShowType.img, showType: AdShowType.img,
), ),
+13 -33
View File
@@ -1,11 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_page/home/provider/home_update_marker_provider.dart'; import 'package:jydj/hj_page/home/provider/home_update_marker_provider.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/indicator/custom_tab_indicator.dart'; import 'package:jydj/tools_base/indicator/custom_tab_indicator.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
@@ -33,47 +31,30 @@ class HomeMainPage extends StatelessWidget {
init: HomeMainLogic(), init: HomeMainLogic(),
tag: "HomeMainLogic", tag: "HomeMainLogic",
builder: (logic) { builder: (logic) {
final isHoliday = holidayTheme.openHoliday; return Scaffold(
return Stack( key: logic.scaffoldKey,
fit: StackFit.expand, endDrawer: HSHomeDrawer(homeLogic: logic),
children: [ //浮窗放 body 里,endDrawer 才能盖住,避免挡住抽屉里的模块点击
//节日皮肤:铺底色 + 顶部通栏背景图 body: Stack(
if (isHoliday) ...[ fit: StackFit.expand,
Container(color: AppColors.primaryColor), children: [
Positioned( _body(logic),
top: 0, const Positioned(right: 12, bottom: 40, child: HomeFloatWidget()),
left: 0,
right: 0,
child: Image.asset(HolidayTheme.theme.mainBg, fit: BoxFit.fitWidth),
),
], ],
Scaffold( ),
key: logic.scaffoldKey,
backgroundColor: isHoliday ? Colors.transparent : null,
endDrawer: HSHomeDrawer(homeLogic: logic),
//浮窗放 body 里,endDrawer 才能盖住,避免挡住抽屉里的模块点击
body: Stack(
fit: StackFit.expand,
children: [
_body(logic, isHoliday),
const Positioned(right: 12, bottom: 40, child: HomeFloatWidget()),
],
),
),
],
); );
}, },
), ),
); );
} }
Widget _body(HomeMainLogic logic, bool isHoliday) { Widget _body(HomeMainLogic logic) {
if (logic.isLoading) return const LoadingCenterWidget(); if (logic.isLoading) return const LoadingCenterWidget();
return Column( return Column(
children: [ children: [
//顶部搜索栏(状态栏 + 导航栏高度) //顶部搜索栏(状态栏 + 导航栏高度)
Container( Container(
color: isHoliday ? Colors.transparent : Colors.black, color: Colors.black,
padding: EdgeInsets.only(top: screen.paddingTop), padding: EdgeInsets.only(top: screen.paddingTop),
height: kToolbarHeight + screen.paddingTop, height: kToolbarHeight + screen.paddingTop,
child: CommonSearchBarView(logic: logic), child: CommonSearchBarView(logic: logic),
@@ -147,12 +128,11 @@ class _HomeTabViewState extends State<HomeTabView> with SingleTickerProviderStat
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isHoliday = holidayTheme.openHoliday;
return Column( return Column(
children: [ children: [
Container( Container(
height: 48.h, height: 48.h,
color: isHoliday ? Colors.transparent : Colors.black, color: Colors.black,
child: _tabBar(), child: _tabBar(),
), ),
Expanded( Expanded(
@@ -1,12 +1,8 @@
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:jydj/hj_model/drama_media_info.dart'; import 'package:jydj/hj_model/drama_media_info.dart';
import 'package:jydj/hj_utils/api_service/acg_service.dart'; import 'package:jydj/hj_utils/api_service/acg_service.dart';
import 'package:jydj/tools_base/debug_log.dart'; import 'package:jydj/tools_base/debug_log.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../../hj_model/home/module_detail_model.dart'; import '../../../hj_model/home/module_detail_model.dart';
import '../../../hj_model/home/plate_model.dart';
import '../../../hj_utils/api_service/vid_service.dart'; import '../../../hj_utils/api_service/vid_service.dart';
import 'home_tab_base_logic.dart'; import 'home_tab_base_logic.dart';
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/track_event_manager/track_manager.dart';
import '../../../hj_model/home/plate_model.dart'; import '../../../hj_model/home/plate_model.dart';
import '../../../hj_model/home/module_detail_model.dart'; import '../../../hj_model/home/module_detail_model.dart';
@@ -51,10 +50,6 @@ class _HomeTabSectionPageState extends State<HomeTabSectionPage> with UniqueTagM
4, 4,
autoStyle: true, autoStyle: true,
padding: EdgeInsets.fromLTRB(12, 0, 12, 12), padding: EdgeInsets.fromLTRB(12, 0, 12, 12),
exposureModel: AdExposureModel(
pageType: widget.isDarkStyle ? TrackEventPageType.darkweb : TrackEventPageType.home,
tabIndex: widget.tabIndex,
),
), ),
), ),
SliverToBoxAdapter(child: QuickEntryRow(widget.tabModel)), SliverToBoxAdapter(child: QuickEntryRow(widget.tabModel)),
@@ -95,10 +90,6 @@ class _HomeTabSectionPageState extends State<HomeTabSectionPage> with UniqueTagM
-1, -1,
ads: section.adsInfoArr ?? [], ads: section.adsInfoArr ?? [],
padding: EdgeInsets.fromLTRB(12, 0, 12, 16), padding: EdgeInsets.fromLTRB(12, 0, 12, 16),
exposureModel: AdExposureModel(
pageType: widget.isDarkStyle ? TrackEventPageType.darkweb : TrackEventPageType.home,
tabIndex: widget.tabIndex * 100 + index,
),
); );
} else if (logic.lastIsGuessLike && index == logic.allSection.length - 1) { } else if (logic.lastIsGuessLike && index == logic.allSection.length - 1) {
return SizedBox(); // 最后一个猜你喜欢列表单独处理 return SizedBox(); // 最后一个猜你喜欢列表单独处理
@@ -12,7 +12,6 @@ import '../../../hj_model/video_model.dart';
import '../../../hj_utils/sliver_delegate.dart'; import '../../../hj_utils/sliver_delegate.dart';
import '../../../tools_base/banner/ads_grid_view.dart'; import '../../../tools_base/banner/ads_grid_view.dart';
import '../../../tools_base/refresh/pull_refresh.dart'; import '../../../tools_base/refresh/pull_refresh.dart';
import '../../../track_event_manager/track_manager.dart';
import '../../cartoon/acg_widget_item.dart'; import '../../cartoon/acg_widget_item.dart';
import '../home_cell_style/quick_entry_row.dart'; import '../home_cell_style/quick_entry_row.dart';
import '../home_cell_style/video_simple_cell.dart'; import '../home_cell_style/video_simple_cell.dart';
@@ -61,10 +60,6 @@ class _HomeTabSortPageState extends State<HomeTabSortPage> with UniqueTagMixin {
4, 4,
autoStyle: true, autoStyle: true,
padding: EdgeInsets.fromLTRB(12, 0, 12, 12), padding: EdgeInsets.fromLTRB(12, 0, 12, 12),
exposureModel: AdExposureModel(
pageType: widget.isDarkStyle ? TrackEventPageType.darkweb : TrackEventPageType.home,
tabIndex: widget.tabIndex,
),
), ),
), ),
SliverToBoxAdapter(child: QuickEntryRow(widget.tabModel)), SliverToBoxAdapter(child: QuickEntryRow(widget.tabModel)),
@@ -96,9 +91,11 @@ class _HomeTabSortPageState extends State<HomeTabSortPage> with UniqueTagMixin {
}, },
child: Obx( child: Obx(
() { () {
//非暗网风格也要读一次:Obx 读不到可观察变量会抛 improper use of a GetX
final isInTop = logic.isSortMenuInTop.value;
Color? bgColor; Color? bgColor;
if (widget.isDarkStyle) { if (widget.isDarkStyle) {
if (logic.isSortMenuInTop.value) { if (isInTop) {
bgColor = Colors.transparent; bgColor = Colors.transparent;
} else { } else {
bgColor = Colors.black; bgColor = Colors.black;
@@ -108,7 +105,6 @@ class _HomeTabSortPageState extends State<HomeTabSortPage> with UniqueTagMixin {
isLatest: logic.isNewestStyle, isLatest: logic.isNewestStyle,
labelPadding: const EdgeInsets.symmetric(horizontal: 10), labelPadding: const EdgeInsets.symmetric(horizontal: 10),
tabs: logic.isNewestStyle ? logic.lastestSortTitles : logic.sortTitles, tabs: logic.isNewestStyle ? logic.lastestSortTitles : logic.sortTitles,
isPinned: !logic.isSortMenuInTop.value,
bgColor: bgColor, bgColor: bgColor,
onSort: logic.sortMenuEvent, onSort: logic.sortMenuEvent,
rightWidget: logic.isNewestStyle ? null : _buildSortStyleMenu(logic), rightWidget: logic.isNewestStyle ? null : _buildSortStyleMenu(logic),
@@ -222,10 +218,6 @@ class _HomeTabSortPageState extends State<HomeTabSortPage> with UniqueTagMixin {
child: VideoSimpleCell( child: VideoSimpleCell(
videoModel: videoModel, videoModel: videoModel,
textLines: logic.isGridStyle.value ? 2 : 1, textLines: logic.isGridStyle.value ? 2 : 1,
exposureModel: AdExposureModel(
pageType: widget.isDarkStyle ? TrackEventPageType.darkweb : TrackEventPageType.home,
tabIndex: widget.tabIndex * 100 + index,
),
), ),
); );
}, },
@@ -260,10 +252,6 @@ class _HomeTabSortPageState extends State<HomeTabSortPage> with UniqueTagMixin {
VideoModel videoModel = subList[index]; VideoModel videoModel = subList[index];
return VideoSimpleCell( return VideoSimpleCell(
videoModel: videoModel, videoModel: videoModel,
exposureModel: AdExposureModel(
pageType: widget.isDarkStyle ? TrackEventPageType.darkweb : TrackEventPageType.home,
tabIndex: widget.tabIndex * 100 + i * gapValue + index,
),
); );
}, },
childCount: subList.length, childCount: subList.length,
@@ -300,10 +288,6 @@ class _HomeTabSortPageState extends State<HomeTabSortPage> with UniqueTagMixin {
VideoModel videoModel = subList[index]; VideoModel videoModel = subList[index];
return VideoSimpleCell( return VideoSimpleCell(
videoModel: videoModel, videoModel: videoModel,
exposureModel: AdExposureModel(
pageType: widget.isDarkStyle ? TrackEventPageType.darkweb : TrackEventPageType.home,
tabIndex: widget.tabIndex * 100 + allIndex * gapValue + index,
),
); );
}, },
childCount: subList.length, childCount: subList.length,
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jydj/assets_tool/app_colors.dart'; import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/hj_page/home/provider/home_update_marker_provider.dart'; import 'package:jydj/hj_page/home/provider/home_update_marker_provider.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
/// 首页模块的排序切换栏(热门推荐 / 最新上架 / ...) /// 首页模块的排序切换栏(热门推荐 / 最新上架 / ...)
@@ -10,7 +9,6 @@ class HomeSortHeader extends StatefulWidget {
final ValueChanged<int> onSort; final ValueChanged<int> onSort;
final List<String>? tabs; final List<String>? tabs;
final EdgeInsets? labelPadding; final EdgeInsets? labelPadding;
final bool isPinned; //已吸顶:节日主题下只有吸顶才铺底色,未吸顶保持透明露出节日背景图
final Widget? rightWidget; final Widget? rightWidget;
final Color? bgColor; final Color? bgColor;
final bool isLatest; final bool isLatest;
@@ -20,7 +18,6 @@ class HomeSortHeader extends StatefulWidget {
required this.onSort, required this.onSort,
this.tabs, this.tabs,
this.labelPadding, this.labelPadding,
this.isPinned = false,
this.rightWidget, this.rightWidget,
this.bgColor, this.bgColor,
this.isLatest = false, this.isLatest = false,
@@ -45,12 +42,9 @@ class _HomeSortHeaderState extends State<HomeSortHeader> with SingleTickerProvid
if (widget.isLatest) { if (widget.isLatest) {
return _buildNewsetsStyle(); return _buildNewsetsStyle();
}else { }else {
final showBg = !holidayTheme.openHoliday || widget.isPinned;
return Container( return Container(
height: 38, height: 38,
color: showBg ? (widget.bgColor ?? Theme color: widget.bgColor ?? Theme.of(context).scaffoldBackgroundColor,
.of(context)
.scaffoldBackgroundColor) : Colors.transparent,
child: widget.rightWidget == null child: widget.rightWidget == null
? _tabBar() ? _tabBar()
: Row(children: [Expanded(child: _tabBar()), widget.rightWidget!]), : Row(children: [Expanded(child: _tabBar()), widget.rightWidget!]),
@@ -79,10 +73,9 @@ class _HomeSortHeaderState extends State<HomeSortHeader> with SingleTickerProvid
/// 「最新」页专用:字号更小、选中态红色胶囊、首个 tab 带更新红点 /// 「最新」页专用:字号更小、选中态红色胶囊、首个 tab 带更新红点
Widget _buildNewsetsStyle() { Widget _buildNewsetsStyle() {
final showBg = !holidayTheme.openHoliday || widget.isPinned;
return Container( return Container(
height: 38, height: 38,
color: showBg ? (widget.bgColor ?? Theme.of(context).scaffoldBackgroundColor) : Colors.transparent, color: widget.bgColor ?? Theme.of(context).scaffoldBackgroundColor,
child: TabBar( child: TabBar(
controller: tabCtr, controller: tabCtr,
isScrollable: true, isScrollable: true,
@@ -4,7 +4,6 @@ import 'package:get/get.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/tools_base/banner/ads_grid_view.dart'; import 'package:jydj/tools_base/banner/ads_grid_view.dart';
import '../../../track_event_manager/track_manager.dart';
import '../../find/rank_module/rank_main_page.dart'; import '../../find/rank_module/rank_main_page.dart';
import '../../find/rank_module/rank_sub_page.dart'; import '../../find/rank_module/rank_sub_page.dart';
import 'search_main_logic.dart'; import 'search_main_logic.dart';
@@ -58,7 +57,6 @@ class SearchMainPage extends StatelessWidget {
32, 32,
autoStyle: true, autoStyle: true,
padding: EdgeInsets.symmetric(vertical: 12.h, horizontal: 12.w), padding: EdgeInsets.symmetric(vertical: 12.h, horizontal: 12.w),
exposureModel: AdExposureModel(pageType: TrackEventPageType.search),
), ),
), ),
//搜索历史:随增删局部刷新,不带动整页(id 要和 logic 里 update 的一致) //搜索历史:随增删局部刷新,不带动整页(id 要和 logic 里 update 的一致)
@@ -9,8 +9,6 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../../../hj_model/acg/cartoon_more_list.dart'; import '../../../../hj_model/acg/cartoon_more_list.dart';
import '../../../../hj_model/cartoon_media_info.dart'; import '../../../../hj_model/cartoon_media_info.dart';
import '../../../../tools_base/refresh/pull_refresh.dart'; import '../../../../tools_base/refresh/pull_refresh.dart';
import '../../../../tools_base/widget/multitap_recognizer.dart';
import '../../../../track_event_manager/track_manager.dart';
import '../../../cartoon/acg_widget_item.dart'; import '../../../cartoon/acg_widget_item.dart';
class SearchACGResultPage extends StatefulWidget { class SearchACGResultPage extends StatefulWidget {
@@ -51,12 +49,6 @@ class _SearchACGResultPageState extends State<SearchACGResultPage> {
} }
videoList?.addAll(retResp?.list ?? []); videoList?.addAll(retResp?.list ?? []);
retResp?.hasNext == false ? refreshController?.loadNoData() : refreshController?.loadComplete(); retResp?.hasNext == false ? refreshController?.loadNoData() : refreshController?.loadComplete();
searchClickManager.searchKeyword(
keyword: widget.keywords,
count: retResp?.list?.length ?? 0,
searchId: '',
traceId: '',
);
} catch (e) { } catch (e) {
refreshController?.loadComplete(); refreshController?.loadComplete();
debugLog(e); debugLog(e);
@@ -93,17 +85,7 @@ class _SearchACGResultPageState extends State<SearchACGResultPage> {
), ),
itemCount: videoList?.length ?? 0, itemCount: videoList?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return MultiTap( return AcgItemWidget(info: videoList![index]);
onTap: () {
searchClickManager.searchClicks(
keyword: widget.keywords,
clickType: TrackEventSearchType.acg,
id: videoList![index].id,
index: index,
traceId: '',
);
},
child: AcgItemWidget(info: videoList![index]));
}, },
), ),
); );
@@ -2,9 +2,7 @@ import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/hj_model/drama_media_info.dart';
import 'package:jydj/hj_model/video_model.dart'; import 'package:jydj/hj_model/video_model.dart';
import 'package:jydj/hj_page/drama/drama_detail_page.dart';
import 'package:jydj/hj_page/drama/drama_tag_detail_page.dart'; import 'package:jydj/hj_page/drama/drama_tag_detail_page.dart';
import 'package:jydj/hj_utils/api_service/drama_service.dart'; import 'package:jydj/hj_utils/api_service/drama_service.dart';
import 'package:jydj/hj_utils/api_service/search_service.dart'; import 'package:jydj/hj_utils/api_service/search_service.dart';
@@ -16,8 +14,6 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../../../hj_model/home/video_list_model.dart'; import '../../../../hj_model/home/video_list_model.dart';
import '../../../../tools_base/refresh/pull_refresh.dart'; import '../../../../tools_base/refresh/pull_refresh.dart';
import '../../../../tools_base/widget/multitap_recognizer.dart';
import '../../../../track_event_manager/track_manager.dart';
import '../../../cartoon/photo_gallery_item.dart'; import '../../../cartoon/photo_gallery_item.dart';
import '../../../community/widget/community_post_widget.dart'; import '../../../community/widget/community_post_widget.dart';
import '../../home_cell_style/drama_cover_card.dart'; import '../../home_cell_style/drama_cover_card.dart';
@@ -83,12 +79,6 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
videoList ??= []; videoList ??= [];
videoList?.addAll(retResp?.list.map((e) => e.toVideoModel(null)) ?? []); videoList?.addAll(retResp?.list.map((e) => e.toVideoModel(null)) ?? []);
retResp?.hasNext != true ? refreshController?.loadNoData() : refreshController?.loadComplete(); retResp?.hasNext != true ? refreshController?.loadNoData() : refreshController?.loadComplete();
searchClickManager.searchKeyword(
keyword: widget.keywords,
count: retResp?.list.length ?? 0,
searchId: '',
traceId: '',
);
} else { } else {
VideoListResp? retResp = await SearchService.searchMedia(widget.keywords, VideoListResp? retResp = await SearchService.searchMedia(widget.keywords,
pageNumber: page, pageSize: size, realm: widget.type.searchRealm, sortType: sortValue); pageNumber: page, pageSize: size, realm: widget.type.searchRealm, sortType: sortValue);
@@ -103,12 +93,6 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
tagID = retResp?.tagID; tagID = retResp?.tagID;
} }
retResp?.hasNext == false ? refreshController?.loadNoData() : refreshController?.loadComplete(); retResp?.hasNext == false ? refreshController?.loadNoData() : refreshController?.loadComplete();
searchClickManager.searchKeyword(
keyword: widget.keywords,
count: retResp?.videos?.length ?? 0,
searchId: '',
traceId: '',
);
} }
} catch (e) { } catch (e) {
refreshController?.loadComplete(); refreshController?.loadComplete();
@@ -186,18 +170,6 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
} }
} }
/// 进短剧二级页;搜索列表不一定带 dramaInfo,最少用 id/标题/封面兜底
void _openDrama(VideoModel model) {
final drama = model.dramaInfo ??
(DramaMediaInfo()
..id = model.id
..title = model.title
..verticalCover = model.cover
..horizontalCover = model.cover
..totalEpisode = model.totalEpisode);
Get.to(() => DramaDetailPage(drama: drama));
}
Widget _buildTypeList() { Widget _buildTypeList() {
if (widget.type == MediaStyle.Drama) { if (widget.type == MediaStyle.Drama) {
return GridView.builder( return GridView.builder(
@@ -211,18 +183,7 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
itemCount: videoList?.length ?? 0, itemCount: videoList?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final model = videoList![index]; final model = videoList![index];
return MultiTap( return DramaCoverCard(mediaInfo: model.dramaInfo!);
onTap: () {
searchClickManager.searchClicks(
keyword: widget.keywords,
clickType: TrackEventSearchType.video,
id: '${model.id}',
index: index,
traceId: '',
);
},
child: DramaCoverCard(mediaInfo: model.dramaInfo!),
);
}, },
); );
} }
@@ -238,22 +199,12 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
), ),
itemCount: videoList?.length ?? 0, itemCount: videoList?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return MultiTap( return VideoSimpleCell(
onTap: () { videoModel: videoList![index],
searchClickManager.searchClicks( textLines: isShort ? 1 : 2,
keyword: widget.keywords, isFromSearch: true,
clickType: TrackEventSearchType.video, isShort: isShort,
id: "${videoList![index].id}", );
index: index,
traceId: '',
);
},
child: VideoSimpleCell(
videoModel: videoList![index],
textLines: isShort ? 1 : 2,
isFromSearch: true,
isShort: isShort,
));
}, },
); );
} else if (widget.type == MediaStyle.Pic) { } else if (widget.type == MediaStyle.Pic) {
@@ -267,17 +218,7 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
), ),
itemCount: videoList?.length ?? 0, itemCount: videoList?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return MultiTap( return PhotoGalleryItem(videoModel: videoList![index], textline: 1);
onTap: () {
searchClickManager.searchClicks(
keyword: widget.keywords,
clickType: TrackEventSearchType.image,
id: "${videoList![index].id}",
index: index,
traceId: '',
);
},
child: PhotoGalleryItem(videoModel: videoList![index], textline: 1));
}, },
); );
} else { } else {
@@ -285,20 +226,10 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemCount: videoList?.length ?? 0, itemCount: videoList?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return MultiTap( return CommunityPostWidget(
onTap: () { videoModel: videoList![index],
searchClickManager.searchClicks( videoModels: videoList,
keyword: widget.keywords, );
clickType: TrackEventSearchType.post,
id: "${videoList![index].id}",
index: index,
traceId: '',
);
},
child: CommunityPostWidget(
videoModel: videoList![index],
videoModels: videoList,
));
}, },
); );
} }
@@ -330,10 +261,7 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final videoModel = tagVidList![index]; final videoModel = tagVidList![index];
return MultiTap( return DramaCoverCard(mediaInfo: videoModel.dramaInfo!);
onTap: (){},
child: DramaCoverCard(mediaInfo: videoModel.dramaInfo!),
);
}, },
), ),
if (tagID?.isNotEmpty == true) ...[ if (tagID?.isNotEmpty == true) ...[
@@ -391,22 +319,11 @@ class _SearchVideoResultPageState extends State<SearchVideoResultPage> {
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
VideoModel videoModel = tagVidList![index]; VideoModel videoModel = tagVidList![index];
return MultiTap( return VideoSimpleCell(
onTap: () { videoModel: videoModel,
searchClickManager.searchClicks( textLines: isShort ? 1 : 2,
keyword: widget.keywords, isFromSearch: true,
clickType: TrackEventSearchType.video, isShort: isShort,
id: "${videoModel.id}",
index: index,
traceId: '',
);
},
child: VideoSimpleCell(
videoModel: videoModel,
textLines: isShort ? 1 : 2,
isFromSearch: true,
isShort: isShort,
),
); );
}, },
), ),
@@ -4,7 +4,6 @@ import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/config/config.dart'; import 'package:jydj/config/config.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import '../../../../hj_utils/holiday_theme.dart';
import '../../../../tools_base/widget/marquee_widget.dart'; import '../../../../tools_base/widget/marquee_widget.dart';
import '../../../../tools_base/widget/net_image_widget.dart'; import '../../../../tools_base/widget/net_image_widget.dart';
import '../../../mine/welfare/sign_daily_page.dart'; import '../../../mine/welfare/sign_daily_page.dart';
@@ -113,7 +112,6 @@ class _CommonSearchBarViewState extends State<CommonSearchBarView> {
/// 签到入口 /// 签到入口
Widget _buildSignIcon() { Widget _buildSignIcon() {
final useHolidayIcon = holidayTheme.openHoliday && HolidayTheme.theme.signIcon.isNotEmpty;
return InkWell( return InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () => Get.to(SignDailyPage()), onTap: () => Get.to(SignDailyPage()),
@@ -11,7 +11,6 @@ import 'package:jydj/hj_model/splash/domain_source_model.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import '../../../hj_utils/api_service/vid_service.dart'; import '../../../hj_utils/api_service/vid_service.dart';
import '../../../hj_utils/holiday_theme.dart';
import '../../../routers/jump_router.dart'; import '../../../routers/jump_router.dart';
class HomeTxtMarQuee extends StatefulWidget { class HomeTxtMarQuee extends StatefulWidget {
@@ -108,12 +107,7 @@ class HomeTxtMarQueeState extends State<HomeTxtMarQuee> with SingleTickerProvide
), ),
child: Row( child: Row(
children: [ children: [
Image.asset( Image.asset("icon_broadcast.png".commonImgPath, width: widget.iconSize ?? 20),
(holidayTheme.openHoliday && HolidayTheme.theme.broadcastIcon.isNotEmpty)
? HolidayTheme.theme.broadcastIcon
: "icon_broadcast.png".commonImgPath,
width: widget.iconSize ?? 20,
),
6.sizeBoxW, 6.sizeBoxW,
Expanded( Expanded(
child: InfiniteMarquee( child: InfiniteMarquee(
@@ -124,7 +118,7 @@ class HomeTxtMarQueeState extends State<HomeTxtMarQuee> with SingleTickerProvide
return InkWell( return InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () { onTap: () {
pushToPageByLink(model.url, id: model.id); pushToPageByLink(model.url);
}, },
child: Text( child: Text(
model.content ?? '', model.content ?? '',
@@ -3,7 +3,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/app_colors.dart'; import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/screen.dart'; // sizeBoxH/sizeBoxW 扩展 import 'package:jydj/hj_utils/screen.dart'; // sizeBoxH/sizeBoxW 扩展
import 'package:jydj/tools_base/widget/sheet_handle_bar.dart'; import 'package:jydj/tools_base/widget/sheet_handle_bar.dart';
@@ -17,7 +16,7 @@ enum PublishEntry {
const PublishEntry(this.width, this.height); const PublishEntry(this.width, this.height);
String realPath() => HolidayTheme.theme.addPublish; String realPath() => 'publish.png'.homePath;
} }
class PublishButton extends StatelessWidget { class PublishButton extends StatelessWidget {
-2
View File
@@ -11,7 +11,6 @@ import 'package:jydj/tools_base/refresh/pull_refresh.dart';
import 'package:jydj/tools_base/widget/net_image_widget.dart'; import 'package:jydj/tools_base/widget/net_image_widget.dart';
import 'package:video_player/video_player.dart'; import 'package:video_player/video_player.dart';
import '../../track_event_manager/track_manager.dart';
import '../video/video_full_page.dart'; import '../video/video_full_page.dart';
import 'live_detail_logic.dart'; import 'live_detail_logic.dart';
@@ -295,7 +294,6 @@ class _LiveDetailPageState extends State<LiveDetailPage> {
36, 36,
autoStyle: true, autoStyle: true,
padding: const EdgeInsets.fromLTRB(16, 18, 0, 0), padding: const EdgeInsets.fromLTRB(16, 18, 0, 0),
exposureModel: AdExposureModel(pageType: TrackEventPageType.liveDetail),
); );
} }
+1 -1
View File
@@ -29,7 +29,7 @@ class LiveMainPage extends StatelessWidget {
controller: logic.tabController, controller: logic.tabController,
children: List.generate( children: List.generate(
logic.liveTabs.length, logic.liveTabs.length,
(index) => LiveSubPage(tagData: logic.liveTabs[index], index: index).keepAlive, (index) => LiveSubPage(tagData: logic.liveTabs[index]).keepAlive,
), ),
), ),
), ),
+1 -4
View File
@@ -8,16 +8,14 @@ import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/refresh/pull_refresh.dart'; import 'package:jydj/tools_base/refresh/pull_refresh.dart';
import 'package:jydj/tools_base/widget/card_swiper/src/swiper.dart'; import 'package:jydj/tools_base/widget/card_swiper/src/swiper.dart';
import '../../track_event_manager/track_manager.dart';
import 'live_model.dart'; import 'live_model.dart';
import 'live_sub_logic.dart'; import 'live_sub_logic.dart';
//直播子列表页面 //直播子列表页面
class LiveSubPage extends StatefulWidget { class LiveSubPage extends StatefulWidget {
final LiveModule? tagData; final LiveModule? tagData;
final int index;
const LiveSubPage({super.key, this.tagData, this.index = 0}); const LiveSubPage({super.key, this.tagData});
@override @override
State<LiveSubPage> createState() => _LiveSubPageState(); State<LiveSubPage> createState() => _LiveSubPageState();
@@ -66,7 +64,6 @@ class _LiveSubPageState extends State<LiveSubPage> {
35, 35,
autoStyle: true, autoStyle: true,
padding: const EdgeInsets.fromLTRB(16, 15, 16, 15), padding: const EdgeInsets.fromLTRB(16, 15, 16, 15),
exposureModel: AdExposureModel(pageType: TrackEventPageType.live, tabIndex: widget.index),
), ),
); );
} }
+13 -25
View File
@@ -1,16 +1,14 @@
import 'dart:async'; import 'dart:async';
import 'package:analytics_sdk/analytics_sdk.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/config/config.dart'; import 'package:jydj/config/config.dart';
import 'package:jydj/hj_model/home/plate_model.dart'; import 'package:jydj/hj_model/home/plate_model.dart';
import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart'; import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart';
import 'package:jydj/hj_utils/const.dart'; import 'package:jydj/hj_utils/const.dart';
import 'package:jydj/hj_utils/free_play_manager.dart'; import 'package:jydj/hj_utils/free_play_manager.dart';
import 'package:jydj/im_manager/im_manager.dart';
import 'package:jydj/tools_base/global_store/store.dart'; import 'package:jydj/tools_base/global_store/store.dart';
import '../../hj_utils/holiday_theme.dart';
import '../../tools_base/event_bus/event_bus_util.dart'; import '../../tools_base/event_bus/event_bus_util.dart';
import '../../tools_base/event_bus/events.dart'; import '../../tools_base/event_bus/events.dart';
import '../../tools_base/toast.dart'; import '../../tools_base/toast.dart';
@@ -46,13 +44,11 @@ class MainTabModel {
final String title; //title final String title; //title
final String imageNor; //nor图片 final String imageNor; //nor图片
final String imageSel; //选中图片 final String imageSel; //选中图片
final String trackKey; //导航埋点key
MainTabModel({ MainTabModel({
required this.title, required this.title,
required this.imageNor, required this.imageNor,
required this.imageSel, required this.imageSel,
required this.trackKey,
}); });
} }
@@ -60,40 +56,34 @@ class MainPageLogic extends GetxController {
final tabs = <MainTabModel>[ final tabs = <MainTabModel>[
MainTabModel( MainTabModel(
title: '首页', title: '首页',
imageNor: HolidayTheme.theme.homeNor, imageNor: 'home_0_0.png'.homePath,
imageSel: HolidayTheme.theme.homeSel, imageSel: 'home_0_1.png'.homePath,
trackKey: 'Home',
), ),
MainTabModel( MainTabModel(
title: '短剧', title: '短剧',
imageNor: HolidayTheme.theme.shortNor, imageNor: 'home_1_0.png'.homePath,
imageSel: HolidayTheme.theme.shortSel, imageSel: 'home_1_1.png'.homePath,
trackKey: 'ShortVideo',
), ),
if (Config.darkWebEnable) if (Config.darkWebEnable)
MainTabModel( MainTabModel(
title: Config.darkWebIconName?.isNotEmpty == true ? Config.darkWebIconName! : '暗网', title: Config.darkWebIconName?.isNotEmpty == true ? Config.darkWebIconName! : '暗网',
imageNor: HolidayTheme.theme.darkNor, imageNor: 'home_2_0.png'.homePath,
imageSel: HolidayTheme.theme.darkSel, imageSel: 'home_2_1.png'.homePath,
trackKey: 'DarkWeb',
), ),
MainTabModel( MainTabModel(
title: 'AI', title: 'AI',
imageNor: HolidayTheme.theme.aiNor, imageNor: 'home_3_0.png'.homePath,
imageSel: HolidayTheme.theme.aiSel, imageSel: 'home_3_1.png'.homePath,
trackKey: 'AI',
), ),
MainTabModel( MainTabModel(
title: '社区', title: '社区',
imageNor: HolidayTheme.theme.communityNor, imageNor: 'home_4_0.png'.homePath,
imageSel: HolidayTheme.theme.communitySel, imageSel: 'home_4_1.png'.homePath,
trackKey: 'Community',
), ),
MainTabModel( MainTabModel(
title: '我的', title: '我的',
imageNor: HolidayTheme.theme.mineNor, imageNor: 'home_5_0.png'.homePath,
imageSel: HolidayTheme.theme.mineSel, imageSel: 'home_5_1.png'.homePath,
trackKey: 'Mine',
), ),
]; ];
@@ -152,7 +142,6 @@ class MainPageLogic extends GetxController {
_backToRoot(); _backToRoot();
jumpToPage(0); jumpToPage(0);
globalStore.refreshWallet(); globalStore.refreshWallet();
unawaited(ImManager().reloginOnAccountSwitch()); //切换账号:登出旧 IM 并用新账号重连,避免私信列表残留旧数据
MineMsgProvider().loadData(); //内含 refreshPayPopup:重拉支付分层配置,即时刷新浮窗/我的横幅/播放器横幅 MineMsgProvider().loadData(); //内含 refreshPayPopup:重拉支付分层配置,即时刷新浮窗/我的横幅/播放器横幅
unawaited(FreePlayManager().refresh()); //切号:免费观看次数是账户维度的,不重拉会一直用着上个账号的次数 unawaited(FreePlayManager().refresh()); //切号:免费观看次数是账户维度的,不重拉会一直用着上个账号的次数
HomeUpdateMarkerProvider().loadData(); HomeUpdateMarkerProvider().loadData();
@@ -275,7 +264,6 @@ class MainPageLogic extends GetxController {
void onClose() { void onClose() {
_yinseSub.cancel(); _yinseSub.cancel();
_loginSub.cancel(); _loginSub.cancel();
unawaited(AnalyticsSdk.instance.dispose());
super.onClose(); super.onClose();
} }
} }
+6 -36
View File
@@ -1,12 +1,9 @@
import 'package:analytics_sdk/analytics_sdk.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_page/main_page/provider/bottom_bar_provider.dart'; import 'package:jydj/hj_page/main_page/provider/bottom_bar_provider.dart';
import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart'; import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/im_manager/im_notification.dart';
import 'package:jydj/tools_base/widget/net_image_widget.dart'; import 'package:jydj/tools_base/widget/net_image_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -42,11 +39,6 @@ class MainPageTabbar extends StatelessWidget {
if (index == logic.tabs.length - 1 && Get.isRegistered<MineMainLogic>()) { if (index == logic.tabs.length - 1 && Get.isRegistered<MineMainLogic>()) {
Get.find<MineMainLogic>().onRefresh(); Get.find<MineMainLogic>().onRefresh();
} }
// 用户点击底部 Tab 时调用,应早于页面切换完成
AnalyticsSdk.instance.trackNavigation(
pageKey: logic.tabs[index].trackKey, // 'Home'
pageName: logic.tabs[index].title, // '主页'
);
} }
@override @override
@@ -96,7 +88,7 @@ class MainPageTabbar extends StatelessWidget {
}); });
} }
/// 普通 tab;最后一个(我的)带私信未读小红点 /// 普通 tab
Widget _normalItem(int index, int cur) { Widget _normalItem(int index, int cur) {
final isSelected = index == cur; final isSelected = index == cur;
final imagePath = _iconPath(index, isSelected); final imagePath = _iconPath(index, isSelected);
@@ -104,32 +96,10 @@ class MainPageTabbar extends StatelessWidget {
child: InkWell( child: InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () => _selectIndex(index), onTap: () => _selectIndex(index),
child: Stack( child: _tabContent(
children: [ isSelected: isSelected,
_tabContent( text: logic.tabs[index].title,
isSelected: isSelected, icon: Image.asset(imagePath, key: ValueKey(imagePath), width: 24),
text: logic.tabs[index].title,
icon: Image.asset(imagePath, key: ValueKey(imagePath), width: 24),
),
if (index == logic.tabs.length - 1)
Consumer<ImMsgProvider>(
builder: (_, imPro, __) {
if (!imPro.hasUnreadCount) return const SizedBox.shrink();
return Positioned(
right: 22,
top: 24,
child: Container(
width: 8,
height: 8,
decoration: BoxDecoration(
color: Color(0xfff74f49),
borderRadius: BorderRadius.all(Radius.circular(6)),
),
),
);
},
),
],
), ),
), ),
); );
@@ -153,7 +123,7 @@ class MainPageTabbar extends StatelessWidget {
AnimatedDefaultTextStyle( AnimatedDefaultTextStyle(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
style: TextStyle( style: TextStyle(
color: isSelected ? HolidayTheme.theme.tabSelColor : HolidayTheme.theme.tabNorColor, color: isSelected ? const Color(0xffFFC000) : const Color(0x59FFFFFF),
fontSize: 10, fontSize: 10,
), ),
child: Text(text), child: Text(text),
+2 -5
View File
@@ -5,7 +5,6 @@ import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart'; import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart';
import 'package:jydj/hj_utils/api_service/vid_service.dart'; import 'package:jydj/hj_utils/api_service/vid_service.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/light_model.dart'; import 'package:jydj/hj_utils/light_model.dart';
import 'package:jydj/hj_utils/store_keys.dart'; import 'package:jydj/hj_utils/store_keys.dart';
import 'package:jydj/tools_base/global_store/store.dart'; import 'package:jydj/tools_base/global_store/store.dart';
@@ -17,7 +16,6 @@ import 'package:jydj/tools_base/widget/common_alert.dart';
import '../../config/config.dart'; import '../../config/config.dart';
import '../../hj_model/user/user_info_model.dart'; import '../../hj_model/user/user_info_model.dart';
import '../../routers/jump_router.dart';
import '../main_page/provider/msg_provider.dart'; import '../main_page/provider/msg_provider.dart';
import '../web_page/h5_page.dart'; import '../web_page/h5_page.dart';
import 'collec_history_buy/col_his_buy_page.dart'; import 'collec_history_buy/col_his_buy_page.dart';
@@ -61,11 +59,10 @@ class MineMainLogic extends GetxController with GetTickerProviderStateMixin {
("账号凭证", 'mine_menu_9.png'.mineImgPath, () => Get.dialog(MineAccountIdentityPage())), ("账号凭证", 'mine_menu_9.png'.mineImgPath, () => Get.dialog(MineAccountIdentityPage())),
("锁屏密码", 'mine_menu_10.png'.mineImgPath, _toggleLockPassword), ("锁屏密码", 'mine_menu_10.png'.mineImgPath, _toggleLockPassword),
("我的消息", 'mine_menu_11.png'.mineImgPath, () => menuTapEvent(3)), ("我的消息", 'mine_menu_11.png'.mineImgPath, () => menuTapEvent(3)),
("在线客服", 'mine_menu_12.png'.mineImgPath, pushToCustomService),
]; ];
List<IconBean> iconList = [ List<IconBean> iconList = [
IconBean(HolidayTheme.theme.appIcon, Config.appName), IconBean('ic_launcher.webp'.commonImgPath, Config.appName),
IconBean('icon_1.webp'.appImgPath, "爱音乐"), IconBean('icon_1.webp'.appImgPath, "爱音乐"),
IconBean('icon_2.webp'.appImgPath, "爱阅读"), IconBean('icon_2.webp'.appImgPath, "爱阅读"),
IconBean('icon_3.webp'.appImgPath, "支付宝"), IconBean('icon_3.webp'.appImgPath, "支付宝"),
@@ -187,6 +184,6 @@ class MineMainLogic extends GetxController with GetTickerProviderStateMixin {
changeIcon(int index) async { changeIcon(int index) async {
if (!await CommonAlert.show(content: '您确定要更换图标吗?')) return; if (!await CommonAlert.show(content: '您确定要更换图标吗?')) return;
const platform = MethodChannel(DeviceInfoService.requestChannel); const platform = MethodChannel(DeviceInfoService.requestChannel);
platform.invokeMethod('changeIcon', {"iconIndex": index == 0 ? holidayTheme.iconIndex : index}); platform.invokeMethod('changeIcon', {"iconIndex": index});
} }
} }
+13 -48
View File
@@ -8,7 +8,6 @@ import 'package:jydj/config/address.dart';
import 'package:jydj/config/config.dart'; import 'package:jydj/config/config.dart';
import 'package:jydj/hj_page/main_page/provider/msg_provider.dart'; import 'package:jydj/hj_page/main_page/provider/msg_provider.dart';
import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart'; import 'package:jydj/hj_page/pre_sale/pre_sale_provider.dart';
import 'package:jydj/im_manager/im_notification.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/routers/jump_router.dart'; import 'package:jydj/routers/jump_router.dart';
import 'package:jydj/tools_base/global_store/store.dart'; import 'package:jydj/tools_base/global_store/store.dart';
@@ -17,10 +16,8 @@ import 'package:jydj/tools_base/toast.dart';
import 'package:jydj/tools_base/widget/net_image_widget.dart'; import 'package:jydj/tools_base/widget/net_image_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../hj_utils/holiday_theme.dart';
import '../../hj_utils/widget_util.dart'; import '../../hj_utils/widget_util.dart';
import '../../tools_base/banner/ads_grid_view.dart'; import '../../tools_base/banner/ads_grid_view.dart';
import '../../track_event_manager/track_manager.dart';
import 'home_mine_logic.dart'; import 'home_mine_logic.dart';
import 'widgets/mine_info_widget.dart'; import 'widgets/mine_info_widget.dart';
import 'widgets/vip_entry_card.dart'; import 'widgets/vip_entry_card.dart';
@@ -65,14 +62,14 @@ class HomeMinePage extends StatelessWidget {
); );
} }
//顶部背景:优先后台下发,兜底节日/默认图 //顶部背景:优先后台下发,兜底默认图
Widget _buildBg() { Widget _buildBg() {
final bg = Config.mineBg; final bg = Config.mineBg;
if (bg != null && bg.isNotEmpty) { if (bg != null && bg.isNotEmpty) {
return NetworkImageLoader(imageUrl: bg, borderRadius: 0); return NetworkImageLoader(imageUrl: bg, borderRadius: 0);
} }
return Image.asset( return Image.asset(
holidayTheme.openHoliday ? HolidayTheme.theme.mineBg : 'mine_bg.webp'.mineImgPath, 'mine_bg.webp'.mineImgPath,
); );
} }
@@ -98,7 +95,6 @@ class HomeMinePage extends StatelessWidget {
8, 8,
autoStyle: true, autoStyle: true,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
exposureModel: AdExposureModel(pageType: TrackEventPageType.mine),
), ),
Container( Container(
margin: EdgeInsets.symmetric(horizontal: 16), margin: EdgeInsets.symmetric(horizontal: 16),
@@ -148,22 +144,12 @@ class HomeMinePage extends StatelessWidget {
"mine_notification.png".mineImgPath, "mine_notification.png".mineImgPath,
width: 28, width: 28,
), ),
Consumer<ImMsgProvider>( Consumer<MineMsgProvider>(
builder: (ctx, imPro, child) { builder: (context, model, child) => Positioned(
if (!imPro.hasUnreadCount) return const SizedBox.shrink(); right: 2,
return Positioned( top: 2,
right: 2, child: model.buildTipsView(),
top: 2, ),
child: Container(
width: 8,
height: 8,
decoration: BoxDecoration(
color: Color(0xfff74f49),
borderRadius: BorderRadius.all(Radius.circular(6)),
),
),
);
},
), ),
], ],
), ),
@@ -249,7 +235,7 @@ class HomeMinePage extends StatelessWidget {
//永久官方地址:地址未下发时不渲染,避免点击/复制空串 //永久官方地址:地址未下发时不渲染,避免点击/复制空串
Widget _buildGroundUrl() { Widget _buildGroundUrl() {
final url = Address.groundUrl; final url = Address.groundUrl;
if (url == null || url.isEmpty) return const SizedBox.shrink(); if (url.isEmpty) return const SizedBox.shrink();
return GestureDetector( return GestureDetector(
onTap: () => launchUrlToWeb(url), onTap: () => launchUrlToWeb(url),
onLongPress: () { onLongPress: () {
@@ -269,31 +255,10 @@ class HomeMinePage extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row( child: Row(
children: [ children: [
Stack( InkWell(
children: [ enableFeedback: false,
InkWell( onTap: () => logic.menuTapEvent(3),
enableFeedback: false, child: Image.asset("mine_notification.png".mineImgPath, width: 24),
onTap: () => logic.menuTapEvent(3),
child: Image.asset("mine_notification.png".mineImgPath, width: 24),
),
Consumer<ImMsgProvider>(
builder: (ctx, imPro, child) {
if (!imPro.hasUnreadCount) return const SizedBox.shrink();
return Positioned(
right: 2,
top: 2,
child: Container(
width: 8,
height: 8,
decoration: BoxDecoration(
color: Color(0xfff74f49),
borderRadius: BorderRadius.all(Radius.circular(6)),
),
),
);
},
),
],
), ),
Spacer(), Spacer(),
InkWell( InkWell(
@@ -145,7 +145,7 @@ class MineAccountIdentityPage extends StatelessWidget {
height: 30, height: 30,
padding: EdgeInsets.symmetric(horizontal: 18, vertical: 3), padding: EdgeInsets.symmetric(horizontal: 18, vertical: 3),
child: Text( child: Text(
'${Config.appName} 官网地址 ${Address.groundUrl ?? ""}', '${Config.appName} 官网地址 ${Address.groundUrl}',
style: TextStyle( style: TextStyle(
color: Colors.white.withValues(alpha: .55), color: Colors.white.withValues(alpha: .55),
fontSize: 12, fontSize: 12,
@@ -143,7 +143,5 @@ MineWithdrawalRecordLogic instanceController(RecordType type) {
return RechargeRecordController(); return RechargeRecordController();
case RecordType.income: case RecordType.income:
return IncomeRecordController(); return IncomeRecordController();
default:
throw '$type 没有找到';
} }
} }
@@ -1,5 +1,4 @@
import 'package:easy_rich_text/easy_rich_text.dart'; import 'package:easy_rich_text/easy_rich_text.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@@ -13,7 +12,6 @@ import 'package:provider/provider.dart';
import '../../../assets_tool/app_colors.dart'; import '../../../assets_tool/app_colors.dart';
import '../../../hj_utils/widget_util.dart'; import '../../../hj_utils/widget_util.dart';
import '../../../routers/jump_router.dart';
import 'in_come_entity.dart'; import 'in_come_entity.dart';
import 'mine_withdrawal_record_page.dart'; import 'mine_withdrawal_record_page.dart';
import 'withdrawal_logic.dart'; import 'withdrawal_logic.dart';
@@ -359,18 +357,6 @@ class WithdrawalPage extends StatelessWidget {
), ),
)), )),
), ),
10.sizeBoxH,
EasyRichText(
'提现中如有问题,请联系 在线客服',
defaultStyle: textStyle(12, Colors.white.withValues(alpha: .8), FontWeight.w400),
patternList: [
EasyRichTextPattern(
targetString: '在线客服',
style: TextStyle(color: Color(0xffFFD460)),
recognizer: TapGestureRecognizer()..onTap = pushToCustomService,
),
],
),
34.sizeBoxH, 34.sizeBoxH,
], ],
) )
@@ -2,13 +2,15 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../hj_utils/api_service/mine_service.dart'; import '../../../hj_utils/api_service/mine_service.dart';
import 'message_center_sub_page.dart';
class MessageCenterLogic extends GetxController with GetTickerProviderStateMixin { class MessageCenterLogic extends GetxController with GetTickerProviderStateMixin {
MessageCenterLogic get to => Get.find<MessageCenterLogic>(); MessageCenterLogic get to => Get.find<MessageCenterLogic>();
late TabController tabController = TabController(length: titleArr.length, vsync: this); late TabController tabController = TabController(length: titleArr.length, vsync: this);
List<String> titleArr = ['私信', '评论', '公告']; List<String> titleArr = ['评论', '公告'];
List<MessageType> typeArr = [MessageType.comment, MessageType.thumb]; //与 titleArr 一一对应
void getUnReadNum() async { void getUnReadNum() async {
await MineService.getUnreadNum(); await MineService.getUnreadNum();
@@ -1,8 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/im_manager/chat_detail_page/Im_ad_view.dart';
import 'package:jydj/im_manager/chat_detail_page/chat_session_list_view.dart';
import 'package:jydj/im_manager/im_ad/im_ad_manager.dart';
import 'package:jydj/tools_base/widget/keep_alive_widget.dart'; import 'package:jydj/tools_base/widget/keep_alive_widget.dart';
import 'message_center_logic.dart'; import 'message_center_logic.dart';
@@ -54,25 +51,7 @@ class MessageCenterPage extends StatelessWidget {
controller: logic.tabController, controller: logic.tabController,
children: logic.titleArr children: logic.titleArr
.asMap() .asMap()
.map((key, value) { .map((key, value) => MapEntry(key, MessageCenterSubPage(logic.typeArr[key]).keepAlive))
final type = MessageType.values[key];
// 私信 Tab 走 IM 会话列表 + 顶部 banner 广告,其余走原有 HTTP 消息
if (type == MessageType.session) {
return MapEntry(
key,
CustomScrollView(slivers: [
SliverToBoxAdapter(
child: ImAdView(
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12),
position: ImAdManager.kPosListBanner,
),
),
const ChatSessionListView(),
]).keepAlive,
);
}
return MapEntry(key, MessageCenterSubPage(type).keepAlive);
})
.values .values
.toList()), .toList()),
), ),
@@ -157,7 +157,5 @@ MineFollowSubLogic instanceController(FollowType type, {int? uid}) {
return TopicController(uid); return TopicController(uid);
case FollowType.actress: case FollowType.actress:
return ActressController(uid); return ActressController(uid);
default:
throw 'type 没有定义';
} }
} }
@@ -280,9 +280,6 @@ class _GesturePasswordWidgetState extends State<GesturePasswordWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//预览小点的边长:每行 singleLineCount 个 10px 的点 + 之间 8px 间距。必须按 singleLineCount 算,
//写死值(原来是 56)比内容宽时 Wrap 默认贴左上,整块预览会偏左偏上,且换行数只对 3x3 成立
final previewSize = 10.0 * widget.singleLineCount + 8 * (widget.singleLineCount - 1);
return Column( return Column(
children: [ children: [
/*SizedBox( /*SizedBox(
@@ -141,7 +141,7 @@ class _BankCardHomePageState extends State<BankCardHomePage> {
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.only(top: 10, bottom: 80), padding: EdgeInsets.only(top: 10, bottom: 80),
shrinkWrap: true, shrinkWrap: true,
itemCount: aliList.length ?? 0, itemCount: aliList.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return _buildCardView(index, aliList[index]); return _buildCardView(index, aliList[index]);
}, },
@@ -3,7 +3,6 @@ import 'package:get/get.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import '../../../hj_utils/permission_util.dart'; import '../../../hj_utils/permission_util.dart';
import '../../../routers/jump_router.dart';
import 'bing_phone_page.dart'; import 'bing_phone_page.dart';
import 'mine_scan_login_page.dart'; import 'mine_scan_login_page.dart';
@@ -21,10 +20,6 @@ class MineFindAccountPage extends StatelessWidget {
} }
} }
}, },
{
'title': '联系客服',
'ontap': () => pushToCustomService(),
}
]; ];
MineFindAccountPage({super.key}); MineFindAccountPage({super.key});
@@ -3,7 +3,6 @@ import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/routers/jump_router.dart'; import 'package:jydj/routers/jump_router.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/config/config.dart'; import 'package:jydj/config/config.dart';
import 'package:jydj/tools_base/toast.dart'; import 'package:jydj/tools_base/toast.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
@@ -82,7 +82,5 @@ MineSettingProfilePage instanceSettingProfileController(SettingProfileType type)
return SettingNickNameController(); return SettingNickNameController();
case SettingProfileType.slogan: case SettingProfileType.slogan:
return SettingSloganController(); return SettingSloganController();
default:
throw '';
} }
} }
@@ -144,7 +144,7 @@ class MineSharePage extends StatelessWidget {
height: 30, height: 30,
padding: EdgeInsets.symmetric(horizontal: 18, vertical: 3), padding: EdgeInsets.symmetric(horizontal: 18, vertical: 3),
child: Text( child: Text(
'${Config.appName} 官网地址 ${Address.groundUrl ?? ""}', '${Config.appName} 官网地址 ${Address.groundUrl}',
style: TextStyle( style: TextStyle(
color: Colors.white.withValues(alpha: .55), color: Colors.white.withValues(alpha: .55),
fontSize: 12, fontSize: 12,
@@ -1,5 +1,3 @@
import 'package:easy_rich_text/easy_rich_text.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -11,7 +9,6 @@ import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../hj_utils/widget_util.dart'; import '../../../hj_utils/widget_util.dart';
import '../../../routers/jump_router.dart';
import '../make_money/mine_withdrawal_record_page.dart'; import '../make_money/mine_withdrawal_record_page.dart';
import 'charge_user_header.dart'; import 'charge_user_header.dart';
import 'mine_charge_coin_logic.dart'; import 'mine_charge_coin_logic.dart';
@@ -98,16 +95,9 @@ class MineChargeCoinPage extends StatelessWidget {
), ),
SliverToBoxAdapter(child: 18.sizeBoxH), SliverToBoxAdapter(child: 18.sizeBoxH),
SliverToBoxAdapter( SliverToBoxAdapter(
child: EasyRichText( child: Text(
'*如提示【交易失败】【账户风险】等,可重新发起订单,或在15分钟后重试支付。如支付未到账,请反馈客服订单号', '*如提示【交易失败】【账户风险】等,可重新发起订单,或在15分钟后重试支付。',
defaultStyle: TextStyle(color: Color(0xff666666), fontSize: 12), style: TextStyle(color: Color(0xff666666), fontSize: 12),
patternList: [
EasyRichTextPattern(
targetString: '反馈客服订单号',
style: TextStyle(color: Color(0xffFFD460), fontWeight: FontWeight.w500),
recognizer: TapGestureRecognizer()..onTap = () => pushToCustomService(),
)
],
).paddingSymmetric(horizontal: 16), ).paddingSymmetric(horizontal: 16),
), ),
], ],
@@ -122,7 +112,7 @@ class MineChargeCoinPage extends StatelessWidget {
); );
} }
// 底部支付按钮 + 客服入口 // 底部支付按钮
Widget _buildBottomBar(MineChargeCoinLogic controller) { Widget _buildBottomBar(MineChargeCoinLogic controller) {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -140,19 +130,6 @@ class MineChargeCoinPage extends StatelessWidget {
), ),
), ),
), ),
12.sizeBoxH,
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('权益长期有效 I 支持帐号找回 I ', style: textStyle(12, Color(0xffBFBFC1), FontWeight.w400)),
GestureDetector(
onTap: () {
pushToCustomService();
},
child: Text('在线客服', style: textStyle(12, Color(0xffFFD460), FontWeight.w400)),
)
],
),
// 垫上虚拟导航栏高度,避免底部内容被遮挡(edge-to-edge) // 垫上虚拟导航栏高度,避免底部内容被遮挡(edge-to-edge)
(16 + screen.paddingBottom).sizeBoxH, (16 + screen.paddingBottom).sizeBoxH,
], ],
@@ -1,8 +1,6 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'package:carousel_slider/carousel_slider.dart'; import 'package:carousel_slider/carousel_slider.dart';
import 'package:easy_rich_text/easy_rich_text.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
@@ -12,7 +10,6 @@ import 'package:jydj/tools_base/unique_tag_mixin.dart';
import 'package:jydj/tools_base/widget/net_image_widget.dart'; import 'package:jydj/tools_base/widget/net_image_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../routers/jump_router.dart';
import '../../pre_sale/pre_sale_entry.dart'; import '../../pre_sale/pre_sale_entry.dart';
import '../make_money/mine_withdrawal_record_page.dart'; import '../make_money/mine_withdrawal_record_page.dart';
import 'charge_user_header.dart'; import 'charge_user_header.dart';
@@ -189,57 +186,6 @@ class _MineChargeVipPageState extends State<MineChargeVipPage> with UniqueTagMix
); );
} }
//核心权益:横向滚动卡片(左图标 + 右文案)—— B 改版
Widget _buildCorePrivileges(List<NewPrivilege> list) {
if (list.isEmpty) return const SizedBox.shrink();
return Column(
children: [
const VipCoreSectionTitleImage(),
16.sizeBoxH,
SizedBox(
height: 92,
child: ListView.separated(
clipBehavior: Clip.none,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.fromLTRB(16, 2, 16, 26),
itemCount: list.length,
separatorBuilder: (_, __) => 8.sizeBoxW,
itemBuilder: (_, index) => VipCorePrivilegeCard(list[index]),
),
),
16.sizeBoxH,
],
);
}
//核心权益:4 列金边方卡 —— A / DISABLED 旧版
Widget _buildClassicCorePrivileges(List<NewPrivilege> list) {
if (list.isEmpty) return const SizedBox.shrink();
return Column(
children: [
const VipSectionTitle("我的核心权益", classic: true),
16.sizeBoxH,
GridView.builder(
padding: const EdgeInsets.symmetric(horizontal: 14),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
crossAxisSpacing: 8,
mainAxisSpacing: 8,
childAspectRatio: 1,
),
itemCount: list.length,
itemBuilder: (_, index) => FittedBox(
fit: BoxFit.contain,
child: SizedBox(width: 72, height: 72, child: VipCorePrivilegeCard(list[index], classic: true)),
),
),
16.sizeBoxH,
],
);
}
//更多权益:深色圆角容器 + 四列网格 + 展开/收起 —— B 改版 //更多权益:深色圆角容器 + 四列网格 + 展开/收起 —— B 改版
Widget _buildMorePrivileges(List<NewPrivilege> list) { Widget _buildMorePrivileges(List<NewPrivilege> list) {
if (list.isEmpty) return const SizedBox.shrink(); if (list.isEmpty) return const SizedBox.shrink();
@@ -274,7 +220,7 @@ class _MineChargeVipPageState extends State<MineChargeVipPage> with UniqueTagMix
); );
} }
//底部支付区域:只有按钮跟选中卡走,渐变底和客服文案是静态的 //底部支付区域:只有按钮跟选中卡走,渐变底是静态的
Widget _buildPay({required bool classic}) { Widget _buildPay({required bool classic}) {
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
@@ -294,18 +240,6 @@ class _MineChargeVipPageState extends State<MineChargeVipPage> with UniqueTagMix
id: MineChargeVipLogic.kSelection, id: MineChargeVipLogic.kSelection,
builder: (logic) => VipPayButton(logic, classic: classic), builder: (logic) => VipPayButton(logic, classic: classic),
), ),
12.sizeBoxH,
EasyRichText(
'权益长期有效 I 支持帐号找回 I 在线客服',
patternList: [
EasyRichTextPattern(
targetString: '在线客服',
style: TextStyle(color: Color(0xFFFFC000), fontSize: 12),
recognizer: TapGestureRecognizer()..onTap = () => pushToCustomService(),
)
],
defaultStyle: TextStyle(color: Color(0xffBFBFC1), fontSize: 12),
),
// 垫上虚拟导航栏高度,避免底部内容被遮挡(edge-to-edge) // 垫上虚拟导航栏高度,避免底部内容被遮挡(edge-to-edge)
(12 + screen.paddingBottom).sizeBoxH, (12 + screen.paddingBottom).sizeBoxH,
], ],
@@ -1,7 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:easy_rich_text/easy_rich_text.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -154,21 +152,6 @@ class _OnlinePayPageState extends State<OnlinePayPage> {
), ),
), ),
), ),
18.sizeBoxH,
//客服入口
Center(
child: EasyRichText(
'支付问题反馈,点击联系 在线客服',
defaultStyle: textStyle(12, Colors.white.withValues(alpha: .6), FontWeight.w500),
patternList: [
EasyRichTextPattern(
targetString: '在线客服',
style: textStyle(12, Color(0xffFFD460), FontWeight.w500),
recognizer: TapGestureRecognizer()..onTap = () => pushToCustomService(),
),
],
),
),
]); ]);
} }
@@ -4,7 +4,6 @@ import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/widget/common_dialog.dart'; import 'package:jydj/tools_base/widget/common_dialog.dart';
import '../../../routers/jump_router.dart';
import '../../../tools_base/global_store/store.dart'; import '../../../tools_base/global_store/store.dart';
class PaySuccessAlert extends StatelessWidget { class PaySuccessAlert extends StatelessWidget {
@@ -34,7 +33,7 @@ class PaySuccessAlert extends StatelessWidget {
0.5.line, 0.5.line,
12.sizeBoxH, 12.sizeBoxH,
Text( Text(
'''1.订单支付后,一般会在1-10分钟内到账,如超时未到账,请联系在线客服为您处理。 '''1.订单支付后,一般会在1-10分钟内到账。
2.受特殊行业限制,如支付失败可尝试重新发起订单,系统将会随机切换备用的支付通道。 2.受特殊行业限制,如支付失败可尝试重新发起订单,系统将会随机切换备用的支付通道。
3.本APP有稳定的广告收益,产品稳定安全,请放心充值使用,如遇报毒提示忽略即可。''', 3.本APP有稳定的广告收益,产品稳定安全,请放心充值使用,如遇报毒提示忽略即可。''',
style: TextStyle( style: TextStyle(
@@ -43,24 +42,6 @@ class PaySuccessAlert extends StatelessWidget {
height: 1.8, height: 1.8,
), ),
), ),
12.sizeBoxH,
InkWell(enableFeedback: false,
onTap: () => pushToCustomService(),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'支付遇到问题',
style: TextStyle(color: Color(0xff999999), fontSize: 14),
),
2.sizeBoxW,
Icon(
Icons.arrow_forward_ios_outlined,
size: 14,
color: Colors.white,
)
],
)),
24.sizeBoxH, 24.sizeBoxH,
InkWell(enableFeedback: false, InkWell(enableFeedback: false,
onTap: () { onTap: () {
@@ -3,8 +3,6 @@ import 'package:get/get.dart';
import 'package:jydj/assets_tool/app_colors.dart'; import 'package:jydj/assets_tool/app_colors.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/hj_utils/widget_util.dart';
import 'package:jydj/routers/jump_router.dart';
import 'package:jydj/tools_base/global_store/store.dart'; import 'package:jydj/tools_base/global_store/store.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -148,25 +146,6 @@ class CoinPayBottomSheet extends StatelessWidget {
); );
}, },
), ),
16.sizeBoxH,
Text.rich(
TextSpan(
style: const TextStyle(fontSize: 12, height: 18 / 12, color: Color(0xff656565)),
children: [
const TextSpan(text: '*如提示【交易失败】【账户风险】等,可重新发起订单,或在15分钟后重试支付。如支付未到账,请'),
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: pushToCustomService,
child: const Text(
'反馈客服订单号',
style: TextStyle(fontSize: 12, height: 18 / 12, color: Color(0xffFFD460)),
),
),
),
],
),
),
18.sizeBoxH, 18.sizeBoxH,
], ],
), ),
@@ -234,7 +213,7 @@ class CoinPayBottomSheet extends StatelessWidget {
); );
} }
/// 立即支付 + 在线客服 /// 立即支付
Widget _buildBottomBar(MineChargeCoinLogic logic) { Widget _buildBottomBar(MineChargeCoinLogic logic) {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -259,17 +238,6 @@ class CoinPayBottomSheet extends StatelessWidget {
), ),
), ),
), ),
12.sizeBoxH,
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('支付问题反馈,点击联系 ', style: textStyle(12, const Color(0xffBFBFC1), FontWeight.w400)),
GestureDetector(
onTap: pushToCustomService,
child: Text('在线客服', style: textStyle(12, const Color(0xffFFD460), FontWeight.w400)),
),
],
),
16.sizeBoxH, 16.sizeBoxH,
], ],
); );
@@ -26,13 +26,13 @@ class _MineQAPageState extends State<MineQAPage> {
{ {
"question": "怎么找回账号?", "question": "怎么找回账号?",
"answer": "answer":
"本平台登录会自动创建账号,需保存账号凭证或绑定手机号码,才能记录之前的账号信息。受行业限制,APP无法正常使用时需升级,未绑定手机号码会导致账号信息丢失。请及时绑定手机号码或保存账号凭证,以免VIP信息丢失,造成巨大财产损失!账号丢失的用户可在 『我的』页面-账号找回,原账号的VIP信息会转移至新账号上。『账号凭证』『手机绑定』都没有的情况下,如账号VIP信息丢失,可以提供VIP支付充值凭证截图联系在线客服为您查询核实恢复VIP。", "本平台登录会自动创建账号,需保存账号凭证或绑定手机号码,才能记录之前的账号信息。受行业限制,APP无法正常使用时需升级,未绑定手机号码会导致账号信息丢失。请及时绑定手机号码或保存账号凭证,以免VIP信息丢失,造成巨大财产损失!账号丢失的用户可在 『我的』页面-账号找回,原账号的VIP信息会转移至新账号上。",
'isOpen': false 'isOpen': false
}, },
{ {
"question": "怎么支付不成功?", "question": "怎么支付不成功?",
"answer": "answer":
"1.因超时支付无法到账,请重新发起。\n2.每天发起支付不能超过5次,连续发起且未支付,账号可能被加入黑名单。\n3.支付通道在夜间比较忙碌,尝试多次发起,后台会为您自动切换不同支付通道。\n4.若充值成功,用户权益通常会在数分钟内到账,请刷新APP或重启。\n6.若支付成功并重启APP后依然没有到账,请联系在线客服并提供付款成功凭证截图。", "1.因超时支付无法到账,请重新发起。\n2.每天发起支付不能超过5次,连续发起且未支付,账号可能被加入黑名单。\n3.支付通道在夜间比较忙碌,尝试多次发起,后台会为您自动切换不同支付通道。\n4.若充值成功,用户权益通常会在数分钟内到账,请刷新APP或重启。",
'isOpen': false 'isOpen': false
}, },
{"question": "收到手机报毒提醒?", "answer": "本平台有主要收益为广告赞助,且保证APP安全无毒,因平台主要展示内容为色情属于特殊行业,某些杀毒软件会误报毒提醒,如遇此类提醒请忽略继续使用。", 'isOpen': false}, {"question": "收到手机报毒提醒?", "answer": "本平台有主要收益为广告赞助,且保证APP安全无毒,因平台主要展示内容为色情属于特殊行业,某些杀毒软件会误报毒提醒,如遇此类提醒请忽略继续使用。", 'isOpen': false},
@@ -4,7 +4,6 @@ import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import 'package:jydj/tools_base/unique_tag_mixin.dart'; import 'package:jydj/tools_base/unique_tag_mixin.dart';
import 'package:jydj/tools_base/widget/keep_alive_widget.dart'; import 'package:jydj/tools_base/widget/keep_alive_widget.dart';
import 'package:jydj/track_event_manager/track_manager.dart';
import 'lou_feng_ad_logic.dart'; import 'lou_feng_ad_logic.dart';
import 'widget/recommend_app_page.dart'; import 'widget/recommend_app_page.dart';
@@ -92,8 +91,5 @@ class _LouFengAdPageState extends State<LouFengAdPage> with UniqueTagMixin {
); );
} }
Widget _adView(LouFengAdLogic logic, int index) => RecommendAppPage( Widget _adView(LouFengAdLogic logic, int index) => RecommendAppPage(logic.configs[index]);
logic.configs[index],
exposureModel: AdExposureModel(tabIndex: index, pageType: TrackEventPageType.appList),
);
} }
@@ -34,8 +34,8 @@ class MoreFreeVideoLogic extends GetxController with GetTickerProviderStateMixin
dataSource.clear(); dataSource.clear();
refreshController?.refreshCompleted(); refreshController?.refreshCompleted();
} }
res?.hasNext ?? false ? refreshController?.loadComplete() : refreshController?.loadNoData(); res.hasNext ?? false ? refreshController?.loadComplete() : refreshController?.loadNoData();
dataSource.addAll(res?.list ?? []); dataSource.addAll(res.list ?? []);
page += 1; page += 1;
update(); update();
} }
@@ -4,7 +4,6 @@ import 'package:jydj/tools_base/widget/keep_alive_widget.dart';
import '../../../tools_base/indicator/custom_tab_indicator.dart'; import '../../../tools_base/indicator/custom_tab_indicator.dart';
import 'lou_feng_ad_page.dart'; import 'lou_feng_ad_page.dart';
import 'mine_income_page.dart';
class WelfareHomePage extends StatefulWidget { class WelfareHomePage extends StatefulWidget {
@@ -3,15 +3,13 @@ import 'package:jydj/hj_model/mine/happy/happy_model.dart';
import 'package:jydj/hj_model/splash/ads_model.dart'; import 'package:jydj/hj_model/splash/ads_model.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/banner/ads_banner.dart'; import 'package:jydj/tools_base/banner/ads_banner.dart';
import 'package:jydj/track_event_manager/track_manager.dart';
import '../../../../tools_base/banner/ads_item.dart'; import '../../../../tools_base/banner/ads_item.dart';
class RecommendAppPage extends StatelessWidget { class RecommendAppPage extends StatelessWidget {
final AdTabConfig model; final AdTabConfig model;
final AdExposureModel? exposureModel;
const RecommendAppPage(this.model, {super.key, this.exposureModel}); const RecommendAppPage(this.model, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return CustomScrollView( return CustomScrollView(
@@ -24,10 +22,7 @@ class RecommendAppPage extends StatelessWidget {
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
child: AspectRatio( child: AspectRatio(
aspectRatio: 343 / 143, aspectRatio: 343 / 143,
child: AdsBanner( child: AdsBanner(model.bannerAds ?? []),
model.bannerAds ?? [],
exposureModel: exposureModel?..adType = AdType.bigBanner,
),
), ),
), ),
), ),
@@ -113,8 +108,6 @@ class RecommendAppPage extends StatelessWidget {
_buildVItem(AdsInfoModel item, int index) { _buildVItem(AdsInfoModel item, int index) {
return AdsItem( return AdsItem(
adInfo: item, adInfo: item,
exposureModel: exposureModel?..adType = AdType.smallIcon,
clickType: 0,
); );
} }
@@ -126,8 +119,6 @@ class RecommendAppPage extends StatelessWidget {
AdsItem( AdsItem(
adInfo: item, adInfo: item,
showType: AdShowType.hor, showType: AdShowType.hor,
exposureModel: exposureModel?..adType = AdType.smallIcon,
clickType: 0,
), ),
12.sizeBoxH, 12.sizeBoxH,
], ],
@@ -138,8 +129,6 @@ class RecommendAppPage extends StatelessWidget {
return AdsItem( return AdsItem(
adInfo: item, adInfo: item,
showType: AdShowType.vImgText, showType: AdShowType.vImgText,
exposureModel: exposureModel?..adType = AdType.smallBanner,
clickType: 0,
); );
} }
} }
@@ -614,7 +614,7 @@ class _TaskItemState extends State<TaskItem> {
/// 任务按钮点击:红包雨 → 跳转 link;未完成 → 去完成;待领取 → 领奖 /// 任务按钮点击:红包雨 → 跳转 link;未完成 → 去完成;待领取 → 领奖
void _onBtnTap(DailyTask task, String btnText) { void _onBtnTap(DailyTask task, String btnText) {
if (btnText == '领红包' || btnText == '待开启') { if (btnText == '领红包' || btnText == '待开启') {
pushToPageByLink(task.link, id: task.id); pushToPageByLink(task.link);
return; return;
} }
switch (task.status) { switch (task.status) {
@@ -623,7 +623,7 @@ class _TaskItemState extends State<TaskItem> {
Get.to(MineChargeCoinPage()); Get.to(MineChargeCoinPage());
return; return;
} }
pushToPageByLink(task.link, id: task.id); pushToPageByLink(task.link);
_doTask(task); _doTask(task);
break; break;
case 1: case 1:
@@ -8,9 +8,7 @@ import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/global_store/store.dart'; import 'package:jydj/tools_base/global_store/store.dart';
import 'package:jydj/tools_base/loading/loading_center_widget.dart'; import 'package:jydj/tools_base/loading/loading_center_widget.dart';
import '../../../routers/jump_router.dart';
import '../../../tools_base/loading/loading_helper.dart'; import '../../../tools_base/loading/loading_helper.dart';
import '../../../tools_base/widget/common_dialog.dart';
import '../../../tools_base/widget/net_image_widget.dart'; import '../../../tools_base/widget/net_image_widget.dart';
import 'integral_exchange_logic.dart'; import 'integral_exchange_logic.dart';
@@ -105,90 +103,8 @@ class IntegralExchangePage extends StatelessWidget {
final res = await MineService.integralExchange(model.id ?? ''); final res = await MineService.integralExchange(model.id ?? '');
LoadingHelper.dismissLoading(); LoadingHelper.dismissLoading();
if (res) { if (res) {
if (model.type == 5) { showToast('兑换成功~');
Get.dialog(InputAddressAlert(model: model));
} else {
showToast('兑换成功~');
}
globalStore.refreshWallet(); globalStore.refreshWallet();
} }
} }
} }
class InputAddressAlert extends StatefulWidget {
// final Function()? confirmCallback;
final IntegralExchangeModel model;
const InputAddressAlert({super.key, required this.model});
@override
State<InputAddressAlert> createState() => _InputAddressAlertState();
}
class _InputAddressAlertState extends State<InputAddressAlert> {
final nameCtr = TextEditingController();
final addressCtr = TextEditingController();
final phoneCtr = TextEditingController();
@override
Widget build(BuildContext context) {
return CommonDialog(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'温馨提示',
style: TextStyle(color: Color(0xffffffff), fontSize: 18.sp, fontWeight: FontWeight.w800),
),
20.h.sizeBoxH,
Divider(
height: 1,
color: Colors.white.withValues(alpha: .1),
),
20.h.sizeBoxH,
Container(
width: double.infinity,
height: 45.h,
alignment: Alignment.center,
padding: EdgeInsets.symmetric(horizontal: 13.w),
child: Text(
"兑换成功!",
style: TextStyle(color: Color(0x8CFFFFFF), fontSize: 18),
textAlign: TextAlign.center,
),
),
5.h.sizeBoxH,
Container(
width: double.infinity,
height: 45.h,
alignment: Alignment.center,
padding: EdgeInsets.symmetric(horizontal: 13.w),
child: Text(
"请联系客服填写收货地址",
style: TextStyle(color: Color(0x8CFFFFFF), fontSize: 18),
textAlign: TextAlign.center,
),
),
20.h.sizeBoxH,
Padding(
padding: EdgeInsets.symmetric(horizontal: 15.w),
child: GestureDetector(
onTap: () async {
pushToCustomService();
},
child: Container(
decoration: BoxDecoration(color: Color(0xffFFC000), borderRadius: BorderRadius.circular(6)),
height: 48,
alignment: Alignment.center,
child: Text(
'联系客服',
style: TextStyle(color: Colors.white, fontSize: 18.sp, fontWeight: FontWeight.w500),
),
),
),
)
],
),
);
}
}
@@ -3,7 +3,6 @@ import 'package:flutter/services.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jydj/assets_tool/images.dart'; import 'package:jydj/assets_tool/images.dart';
import 'package:jydj/hj_model/video_model.dart'; import 'package:jydj/hj_model/video_model.dart';
import 'package:jydj/hj_utils/holiday_theme.dart';
import 'package:jydj/hj_utils/screen.dart'; import 'package:jydj/hj_utils/screen.dart';
import 'package:jydj/tools_base/global_store/store.dart'; import 'package:jydj/tools_base/global_store/store.dart';
import 'package:jydj/tools_base/toast.dart'; import 'package:jydj/tools_base/toast.dart';
@@ -13,9 +12,7 @@ import '../../home/widget/user_avatar.dart';
import '../../home/widget/user_name_view.dart'; import '../../home/widget/user_name_view.dart';
import '../collec_history_buy/col_his_buy_page.dart'; import '../collec_history_buy/col_his_buy_page.dart';
import '../home_mine_logic.dart'; import '../home_mine_logic.dart';
import '../mine_following/mine_following_view.dart';
import '../mine_setting/mine_setting_page.dart'; import '../mine_setting/mine_setting_page.dart';
import '../mine_video_cache/video_cache_page.dart';
import '../mine_vip/mine_charge_coin_page.dart'; import '../mine_vip/mine_charge_coin_page.dart';
import '../mine_vip/mine_charge_vip_page.dart'; import '../mine_vip/mine_charge_vip_page.dart';
import '../welfare/sign_daily_page.dart'; import '../welfare/sign_daily_page.dart';
@@ -157,7 +154,7 @@ class MineTaskMenuWidget extends StatelessWidget {
InkWell( InkWell(
enableFeedback: false, enableFeedback: false,
onTap: () => Get.to(() => MineChargeVipPage(), preventDuplicates: false), onTap: () => Get.to(() => MineChargeVipPage(), preventDuplicates: false),
child: _buildItem("", HolidayTheme.theme.vipEnter, 0), child: _buildItem("", 'mine_vip_enter.webp'.mineImgPath, 0),
), ),
InkWell( InkWell(
enableFeedback: false, enableFeedback: false,
@@ -167,14 +164,14 @@ class MineTaskMenuWidget extends StatelessWidget {
}, },
child: _buildItem( child: _buildItem(
"余额:${(globalStore.wallet?.amount ?? 0) + (globalStore.wallet?.income ?? 0)}", "余额:${(globalStore.wallet?.amount ?? 0) + (globalStore.wallet?.income ?? 0)}",
HolidayTheme.theme.coin, 'mine_gold_enter.webp'.mineImgPath,
15, 15,
), ),
), ),
InkWell( InkWell(
enableFeedback: false, enableFeedback: false,
onTap: _openAiGirlFriendDetail, onTap: _openAiGirlFriendDetail,
child: _buildItem("", HolidayTheme.theme.aiEnter, 0), child: _buildItem("", 'mine_ai_enter.webp'.mineImgPath, 0),
), ),
]; ];
return Stack( return Stack(
@@ -145,7 +145,7 @@ class _MineShareQRViewState extends State<MineShareQRView> {
borderRadius: BorderRadius.circular(30), borderRadius: BorderRadius.circular(30),
), ),
child: Text( child: Text(
'${Config.appName} 官网地址 ${Address.groundUrl ?? ""}', '${Config.appName} 官网地址 ${Address.groundUrl}',
style: TextStyle( style: TextStyle(
color: Colors.white.withValues(alpha: .55), color: Colors.white.withValues(alpha: .55),
fontSize: 12, fontSize: 12,

Some files were not shown because too many files have changed in this diff Show More