From 62f25b11be6968ef02882b68889b12d0ab217cec Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Tue, 2 Apr 2024 10:51:45 +0200 Subject: [PATCH] fix: allow tracking on PageRoute screens using the PosthogObserver as well --- CHANGELOG.md | 2 ++ lib/src/posthog_observer.dart | 31 ++++++++++++++++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3db56f..1eb2637 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## Next +- Allow tracking non `PageRoute` screens using the `PosthogObserver` ([#108]( + ## 4.3.0 - add PrivacyInfo ([#94](https://github.com/PostHog/posthog-flutter/pull/94)) diff --git a/lib/src/posthog_observer.dart b/lib/src/posthog_observer.dart index e973924..135f935 100644 --- a/lib/src/posthog_observer.dart +++ b/lib/src/posthog_observer.dart @@ -12,39 +12,44 @@ class PosthogObserver extends RouteObserver> { final ScreenNameExtractor _nameExtractor; - void _sendScreenView(PageRoute route) { - String? screenName = _nameExtractor(route.settings); - if (screenName != null) { + bool _isTrackeableRoute(String? name) { + return name != null && name.trim().isNotEmpty; + } + + void _sendScreenView(Route? route) { + if (route == null) { + return; + } + + var screenName = _nameExtractor(route.settings); + if (_isTrackeableRoute(screenName)) { // if the screen name is the root route, we send it as root ("/") instead of only "/" if (screenName == '/') { screenName = 'root (\'/\')'; } - Posthog().screen(screenName: screenName); + Posthog().screen(screenName: screenName!); } } @override void didPush(Route route, Route? previousRoute) { super.didPush(route, previousRoute); - if (route is PageRoute) { - _sendScreenView(route); - } + + _sendScreenView(route); } @override void didReplace({Route? newRoute, Route? oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - if (newRoute is PageRoute) { - _sendScreenView(newRoute); - } + + _sendScreenView(newRoute); } @override void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); - if (previousRoute is PageRoute && route is PageRoute) { - _sendScreenView(previousRoute); - } + + _sendScreenView(previousRoute); } }