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

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