Initial commit: 91dj android client dev_1.0.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
谢宇宁
2026-10-08 11:37:25 +07:00
co-authored by Claude Opus 5.5
commit 97dd6a739a
1262 changed files with 119813 additions and 0 deletions
@@ -0,0 +1,67 @@
import 'package:analytics_sdk/const/event_type.dart';
import 'package:analytics_sdk/manager/page_name_manager.dart';
import 'package:analytics_sdk/manager/sdk_context.dart';
/// 导航菜单点击事件(纯手动上报)。
///
/// 仅在用户主动点击导航菜单时触发:底部 Tab、顶部 Tab、侧边抽屉等。
/// SDK 不会在路由跳转时自动发送此事件;触发方式:
/// - [AnalyticsSdk.trackNavigation] 手动调用
/// - [BottomNavigationBar.withAnalytics] / [TabBar.withAnalytics] 包装器内部自动处理
///
/// **page_key / page_name 填写规范**
///
/// 建议使用 [AppPageEnum] 预定义值,也可直接传入自定义字符串:
/// ```dart
/// NavigationEvent(
/// navigationKey: AppPageEnum.video.key, // 'video'
/// navigationName: AppPageEnum.video.name, // '影视'
/// )
/// ```
///
/// **上报时序**:应在同次导航的 [AppPageViewEvent] 之前发出。
class NavigationEvent {
final String event = EventType.navigation.event;
late final String eventId;
/// 导航目标的唯一标识,与对应页面的 [AppPageViewEvent.pageKey] 保持一致。
///
/// 示例:`home`(首页)、`video`(影视)、`video_hot`(影视·热门子 Tab)
final String navigationKey;
/// 导航目标的展示名称。
///
/// 示例:`首页`、`影视`、`影视·热门`
final String navigationName;
late final Map<String, dynamic> _commonFields;
NavigationEvent({
required String navigationKey,
required this.navigationName,
}) : navigationKey = PageNameMapper.normalizeKey(navigationKey) {
_commonFields = SdkContext.generateCommonFields(event);
eventId = SdkContext.generateEventIdFromCommonFields(_commonFields, [
this.navigationKey,
navigationName,
]);
}
/// 序列化为上报 JSON;payload 包含 `navigation_key` 和 `navigation_name`。
Map<String, dynamic> toJson() {
Map<String, dynamic> payload = {
'navigation_key': navigationKey,
'navigation_name': navigationName,
};
return {..._commonFields, 'event_id': eventId, "payload": payload};
}
/// 从 JSON 反序列化(通常用于缓存恢复场景)。
factory NavigationEvent.fromJson(Map<String, dynamic> json) {
return NavigationEvent(
navigationKey: json['navigation_key'] as String,
navigationName: json['navigation_name'] as String,
);
}
}