Skip to content

Commit 18c3bcf

Browse files
committed
add automatic tracking page
1 parent 3caeaec commit 18c3bcf

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import 'package:app/main/init.dart';
2+
import 'package:common/analytics/abstract/analytics_client.dart';
3+
import 'package:flutter/material.dart';
4+
5+
/// A base class for pages that are tracked for analytics purposes.
6+
/// This class can be extended to implement specific tracking logic
7+
/// for different pages in the application.
8+
/// class HomePage extends TrackedPage {
9+
/// const HomePage({super.key});
10+
/// @override
11+
/// String get trackingName => "home_page";
12+
/// @override
13+
/// Map<String, dynamic>? get trackingProperties => {
14+
/// 'userType': 'guest',
15+
/// 'origin': 'splash_screen',
16+
/// };
17+
/// ............
18+
///}
19+
abstract class TrackedPage extends StatefulWidget {
20+
const TrackedPage({super.key});
21+
22+
/// Define nombre de eventos
23+
String get trackingName;
24+
25+
/// Eventos automáticos
26+
bool get trackOnCreate => true;
27+
bool get trackOnEnter => true;
28+
bool get trackOnExit => true;
29+
bool get trackOnDispose => false;
30+
31+
/// Para agregar propiedades adicionales al evento
32+
Map<String, dynamic>? get trackingProperties => null;
33+
34+
/// Build normal
35+
Widget buildPage(BuildContext context);
36+
37+
@override
38+
State<TrackedPage> createState() => _TrackedPageState();
39+
}
40+
41+
class _TrackedPageState extends State<TrackedPage> with RouteAware {
42+
ModalRoute? _route;
43+
44+
AnalyticsClient get analytics => getIt<AnalyticsClient>();
45+
46+
void _track(String phase) {
47+
analytics.trackEvent('${widget.trackingName}_$phase',
48+
properties: widget.trackingProperties);
49+
}
50+
51+
@override
52+
void initState() {
53+
super.initState();
54+
WidgetsBinding.instance.addPostFrameCallback((_) {
55+
if (widget.trackOnCreate) _track("create");
56+
});
57+
}
58+
59+
@override
60+
void didChangeDependencies() {
61+
super.didChangeDependencies();
62+
_route = ModalRoute.of(context);
63+
if (_route is PageRoute) {
64+
routeObserver.subscribe(this, _route as PageRoute);
65+
}
66+
}
67+
68+
@override
69+
void dispose() {
70+
if (widget.trackOnDispose) _track("dispose");
71+
if (_route is PageRoute) {
72+
routeObserver.unsubscribe(this);
73+
}
74+
super.dispose();
75+
}
76+
77+
@override
78+
void didPush() {
79+
if (widget.trackOnEnter) _track("enter");
80+
}
81+
82+
@override
83+
void didPopNext() {
84+
if (widget.trackOnEnter) _track("enter");
85+
}
86+
87+
@override
88+
void didPushNext() {
89+
if (widget.trackOnExit) _track("exit");
90+
}
91+
92+
@override
93+
void didPop() {
94+
if (widget.trackOnExit) _track("exit");
95+
}
96+
97+
@override
98+
Widget build(BuildContext context) {
99+
return widget.buildPage(context);
100+
}
101+
}

0 commit comments

Comments
 (0)