Dubhe
Committed by GitHub

feat: add event handler config

# Auto_Track_Plugin
> Flutter 自动埋点插件,支持 Android 和 iOS
> Flutter埋点插件,支持 Android 和 iOS
低侵入全局自动埋点,自动记录页面进入、退出,点击、滑动等事件,并支持自定义事件。
## Getting Started 使用指南
只需在入口配置`AutoTrack().config()`即可启用全局埋点
目前仅在移动端验证通过,其他平台暂无验证。
### Installation 安装
... ... @@ -39,8 +41,10 @@ class _MyAppState extends State<MyApp> {
AutoTrack()
.config(AutoTrackConfig( // 其余配置可查看AutoTrackConfig类
host: 'http://localhost:3000/api/track',
appKey: 'xxxx',
appSecret: 'xxxx',
eventHandler: (model) => {
// 事件触发会调用此方法,可自行处理
print('event handler ${model.type}')
},
pageConfigs: [
AutoTrackPageConfig<PageA>(
pageID: 'page_a', // 配置页面ID,统计时可基于此ID进行统计
... ... @@ -124,9 +128,10 @@ class PageA extends StatelessWidget {
```
### Data upload 数据上报
数据上报需配合服务端使用,参考 [AutoTrack Server(开发中)](https://github.com/epoll-j/auto_track_server),可自行实现服务端。
数据上报的格式
#### 配置host并启用数据上报后会定时上报数据
##### 数据上报的格式
```
{
'app_key': config.appKey ?? '',
... ...
... ... @@ -3,7 +3,6 @@ import 'package:auto_track_example/home.dart';
import 'package:auto_track_example/page_a.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
... ... @@ -20,6 +19,9 @@ class _MyAppState extends State<MyApp> {
void initState() {
AutoTrack()
.config(AutoTrackConfig(
eventHandler: (model) => {
print('event handler ${model.type}')
},
pageConfigs: [
AutoTrackPageConfig<PageA>(
pageID: 'page_a',
... ...
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.appKey = '',
this.host, // 数据上报地址
this.uploadInterval, // 数据上报间隔
this.appKey = '', // 数据上报时根据key和secret生成签名
this.appSecret = '',
this.trackId,
this.userId,
this.signature,
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 [],
this.useCustomRoute = false, // 使用自定义路由
this.ignoreElementKeys = const [], // 忽略key列表
this.ignoreElementStringKeys = const [],
this.enablePageView = true,
this.enablePageLeave = false,
this.enableClick = true,
this.enableUpload = false,
this.enableDrag = false,
this.enableIgnoreNullKey = false,
this.uploadInterval
this.enablePageView = true, // 监听页面进入事件
this.enablePageLeave = false, // 监听页面离开事件
this.enableClick = true, // 监听点击事件
this.enableDrag = false, // 监听拖拽事件
this.enableIgnoreNullKey = false, // 忽略空key事件
}) {
trackId ??= const Uuid().v4().replaceAll('-', '');
signature ??= (t) => sha256.convert(utf8.encode('$appKey$t$appSecret')).toString();
... ... @@ -39,6 +43,7 @@ class AutoTrackConfig {
int? uploadInterval;
Function? signature;
EventHandlerFunc? eventHandler;
List<AutoTrackPageConfig> pageConfigs;
... ... @@ -87,6 +92,4 @@ class AutoTrackPageConfig<T extends Widget> {
bool ignore;
String? pageTitle;
PageWidgetFunc? isPageWidget;
// bool isPageWidget(Widget pageWidget) => pageWidget is T;
}
... ...
... ... @@ -111,22 +111,32 @@ class Track {
class _TrackPlugin {
static void pageView(Map<String, dynamic> params) {
AutoTrackQueue.instance.appendQueue(TrackModel('page_view', DateTime.now().millisecondsSinceEpoch, params, params['page_manual_key']));
var model = TrackModel('page_view', DateTime.now().millisecondsSinceEpoch, params, params['page_manual_key']);
AutoTrackConfigManager.instance.config.eventHandler?.call(model);
AutoTrackQueue.instance.appendQueue(model);
}
static void pageLeave(Map<String, dynamic> params) {
AutoTrackQueue.instance.appendQueue(TrackModel('page_leave', DateTime.now().millisecondsSinceEpoch, params, params['page_manual_key']));
var model = TrackModel('page_leave', DateTime.now().millisecondsSinceEpoch, params, params['page_manual_key']);
AutoTrackConfigManager.instance.config.eventHandler?.call(model);
AutoTrackQueue.instance.appendQueue(model);
}
static void click(Map<String, dynamic> params) {
AutoTrackQueue.instance.appendQueue(TrackModel('click', DateTime.now().millisecondsSinceEpoch, params, params['element_manual_key']));
var model = TrackModel('click', DateTime.now().millisecondsSinceEpoch, params, params['element_manual_key']);
AutoTrackConfigManager.instance.config.eventHandler?.call(model);
AutoTrackQueue.instance.appendQueue(model);
}
static void customEvent(String type, Map<String, dynamic> params) {
AutoTrackQueue.instance.appendQueue(TrackModel(type, DateTime.now().millisecondsSinceEpoch, params, params['key'] ?? type));
var model = TrackModel(type, DateTime.now().millisecondsSinceEpoch, params, params['key'] ?? type);
AutoTrackConfigManager.instance.config.eventHandler?.call(model);
AutoTrackQueue.instance.appendQueue(model);
}
static void drag(Map<String, dynamic> params) {
AutoTrackQueue.instance.appendQueue(TrackModel('drag', DateTime.now().millisecondsSinceEpoch, params, params['manual_key']));
var model = TrackModel('drag', DateTime.now().millisecondsSinceEpoch, params, params['manual_key']);
AutoTrackConfigManager.instance.config.eventHandler?.call(model);
AutoTrackQueue.instance.appendQueue(model);
}
}
... ...
name: auto_track
name: auto_track_plugin
description: "Auto Track Plugin"
version: 0.0.4
homepage: https://github.com/epoll-j/auto_track_plugin
... ...