analytics_logger 1.0.0
analytics_logger: ^1.0.0 copied to clipboard
Lightweight analytics event logging for Flutter apps.
example/analytics_logger_example.dart
import 'package:analytics_logger/analytics_logger.dart';
import 'package:flutter/foundation.dart';
import 'analytics_category_example.dart';
import 'my_firebase_uploader_example.dart';
class AnalyticsLoggerExample {
AnalyticsLoggerExample._();
static final AnalyticsLoggerExample I = AnalyticsLoggerExample._();
late final AnalyticsLogger _tracker;
/// 初始化
Future<void> setupAnalytics() async {
_tracker = AnalyticsLogger(
config: const AnalyticsConfig(
batchSize: 20,
flushInterval: Duration(seconds: 15),
maxRetryCount: 6,
maxQueueSize: 5000,
enableDebugPrint: true,
schemaVersion: '1',
),
routePolicy: const DefaultRoutePolicy(),
uploaders: {
'default': MyFirebaseUploaderExample(),
},
);
await _tracker.init();
}
/// 登录/退出时调用
// static Future<void> setUserId(String? id) async {
// await FirebaseAnalytics.instance.setUserId(id: id);
// }
/// 公共上报入口
Future<void> log({
required AnalyticsCategoryExample category,
required String event,
Map<String, Object?> parameters = const {},
}) async {
try {
final Map<String, Object> finalParams = {
'event': event,
..._normalizeParams(parameters),
};
_tracker.track(
category.eventName,
params: finalParams,
);
if (kDebugMode) {
debugPrint(
'[Analytics] name=${category.eventName}, params=$finalParams',
);
}
} catch (e, s) {
if (kDebugMode) {
debugPrint('[Analytics][upload failed] $e');
debugPrint('$s');
}
}
}
/// 业务埋点
Future<void> biz({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.business,
event: event,
parameters: parameters,
);
}
/// 页面埋点
Future<void> page({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.page,
event: event,
parameters: parameters,
);
}
/// 性能埋点
Future<void> perf({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.perf,
event: event,
parameters: parameters,
);
}
/// 错误埋点
Future<void> error({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.error,
event: event,
parameters: parameters,
);
}
/// 崩溃补充埋点
Future<void> crash({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.crash,
event: event,
parameters: parameters,
);
}
/// 网络埋点
Future<void> net({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.net,
event: event,
parameters: parameters,
);
}
/// 用户埋点
Future<void> user({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.user,
event: event,
parameters: parameters,
);
}
/// 核心事件埋点
Future<void> key({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.key,
event: event,
parameters: parameters,
);
}
/// 调试埋点
Future<void> debug({
required String event,
Map<String, Object?> parameters = const {},
}) {
return log(
category: AnalyticsCategoryExample.debug,
event: event,
parameters: parameters,
);
}
/// 过滤 Firebase 不支持的参数类型
Map<String, Object> _normalizeParams(Map<String, Object?> params) {
final Map<String, Object> result = {};
params.forEach((key, value) {
if (value == null) return;
if (value is String || value is int || value is double) {
result[key] = value;
} else if (value is bool) {
result[key] = value ? 1 : 0;
} else {
result[key] = value.toString();
}
});
return result;
}
}