Skip to content

Commit fa6ca2f

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

File tree

2 files changed

+112
-0
lines changed

2 files changed

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

0 commit comments

Comments
 (0)