Files
hjsq_android/analytics_sdk/lib/entity/navigation_event.dart
T
2026-10-08 11:37:25 +07:00

68 lines
2.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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,
);
}
}