config.dart
4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import 'dart:convert';
import 'package:auto_track/auto_track/utils/track_model.dart';
import 'package:crypto/crypto.dart';
import 'package:flutter/widgets.dart';
import 'package:uuid/uuid.dart';
typedef EventHandlerFunc = void Function(TrackModel);
class AutoTrackConfig {
AutoTrackConfig({
this.host, // 数据上报地址
this.uploadInterval, // 数据上报间隔
this.samplingRate = 1, // 采样率
this.appKey = '', // 数据上报时根据key和secret生成签名
this.appSecret = '',
this.signature, // 签名生成方法,默认使用sha256对key、时间戳和secret进行签名
this.enableUpload = false, // 开启数据上报
this.trackId, // 埋点ID,默认使用UUID,每次启动时会变化
this.userId, // 用户ID
this.uniqueId,
this.eventHandler, // 事件处理
this.pageConfigs = const [],
this.useCustomRoute = false, // 使用自定义路由
this.ignoreElementKeys = const [], // 忽略key列表
this.ignoreElementStringKeys = const [],
this.enablePageView = true, // 监听页面进入事件
this.enablePageLeave = false, // 监听页面离开事件
this.enableClick = true, // 监听点击事件
this.enableDrag = false, // 监听拖拽事件
this.enableIgnoreNullKey = false, // 忽略空key事件
this.httpRequestConfig,
}) {
trackId ??= const Uuid().v4().replaceAll('-', '');
signature ??=
(t) => sha256.convert(utf8.encode('$appKey$t$appSecret')).toString();
httpRequestConfig ??= HttpRequestConfig();
}
String? host;
String? appKey;
String? appSecret;
String? trackId;
String? userId;
String? uniqueId;
/// 采样率,默认 1 (100%)
double samplingRate;
int? uploadInterval;
Function? signature;
EventHandlerFunc? eventHandler;
List<AutoTrackPageConfig> pageConfigs;
/// 如果使用 MaterialPageRoute/PageRoute/ModalRoute 之外的 Route,
/// 请打开该开关,并保证所有页面都配置在 pageConfigs 中
bool useCustomRoute;
/// 推荐使用 [ElementKey]
List<Key> ignoreElementKeys;
List<String> ignoreElementStringKeys;
Set<Key> getIgnoreElementKeySet() => Set.from(ignoreElementKeys);
Set<String> getIgnoreElementStringKeySet() =>
Set.from(ignoreElementStringKeys);
bool enablePageView;
bool enablePageLeave;
bool enableClick;
bool enableUpload;
bool enableDrag;
bool enableIgnoreNullKey;
HttpRequestConfig? httpRequestConfig;
copyWith({
String? host,
String? appKey,
String? appSecret,
String? trackId,
String? userId,
String? uniqueId,
double? samplingRate,
int? uploadInterval,
Function? signature,
EventHandlerFunc? eventHandler,
List<AutoTrackPageConfig>? pageConfigs,
bool? useCustomRoute,
List<Key>? ignoreElementKeys,
List<String>? ignoreElementStringKeys,
bool? enablePageView,
bool? enablePageLeave,
bool? enableClick,
bool? enableUpload,
bool? enableDrag,
bool? enableIgnoreNullKey,
HttpRequestConfig? httpRequestConfig
}) {
return AutoTrackConfig(
host: host ?? this.host,
appKey: appKey ?? this.appKey,
appSecret: appSecret ?? this.appSecret,
trackId: trackId ?? this.trackId,
userId: userId ?? this.userId,
uniqueId: uniqueId ?? this.uniqueId,
samplingRate: samplingRate ?? this.samplingRate,
uploadInterval: uploadInterval ?? this.uploadInterval,
signature: signature ?? this.signature,
eventHandler: eventHandler ?? this.eventHandler,
pageConfigs: pageConfigs ?? this.pageConfigs,
useCustomRoute: useCustomRoute ?? this.useCustomRoute,
ignoreElementKeys: ignoreElementKeys ?? this.ignoreElementKeys,
ignoreElementStringKeys:
ignoreElementStringKeys ?? this.ignoreElementStringKeys,
enablePageView: enablePageView ?? this.enablePageView,
enablePageLeave: enablePageLeave ?? this.enablePageLeave,
enableClick: enableClick ?? this.enableClick,
enableUpload: enableUpload ?? this.enableUpload,
enableDrag: enableDrag ?? this.enableDrag,
enableIgnoreNullKey: enableIgnoreNullKey ?? this.enableIgnoreNullKey,
httpRequestConfig: httpRequestConfig ?? this.httpRequestConfig
);
}
}
typedef PageWidgetFunc = bool Function(Widget);
class AutoTrackPageConfig<T extends Widget> {
AutoTrackPageConfig(
{this.pageID,
this.pagePath,
this.ignore = false,
this.pageTitle,
this.isPageWidget}) {
isPageWidget ??= (pageWidget) => pageWidget is T;
}
String? pageID;
String? pagePath;
bool ignore;
String? pageTitle;
PageWidgetFunc? isPageWidget;
}
class HttpRequestConfig {
bool ignoreRequestHeader;
bool ignoreResponseHeader;
HttpRequestConfig({
this.ignoreRequestHeader = false,
this.ignoreResponseHeader = false,
});
}