feat: integrate Firebase Analytics and configure navigation observer in app router

This commit is contained in:
pradeepkumar
2026-04-24 23:47:49 +05:30
parent f18b35d1a3
commit 07c128f2ee
5 changed files with 47 additions and 1 deletions

View File

@@ -0,0 +1,13 @@
import 'package:firebase_analytics/firebase_analytics.dart';
/// Firebase Analytics feeds the linked GA4 property (`G-DHR81R6Z63` on web,
/// native app streams for iOS/Android). One instance is reused across the app
/// for events, and one observer tracks GoRouter screen transitions.
class FirebaseAnalyticsConfig {
FirebaseAnalyticsConfig._();
static final FirebaseAnalytics instance = FirebaseAnalytics.instance;
static final FirebaseAnalyticsObserver navigationObserver =
FirebaseAnalyticsObserver(analytics: instance);
}

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:real_estate_mobile/core/analytics/firebase_analytics_config.dart';
import 'package:real_estate_mobile/core/analytics/umami_analytics.dart'; import 'package:real_estate_mobile/core/analytics/umami_analytics.dart';
import 'package:real_estate_mobile/core/constants/app_colors.dart'; import 'package:real_estate_mobile/core/constants/app_colors.dart';
import 'package:real_estate_mobile/core/widgets/app_shell.dart'; import 'package:real_estate_mobile/core/widgets/app_shell.dart';
@@ -45,7 +46,10 @@ final routerProvider = Provider<GoRouter>((ref) {
return GoRouter( return GoRouter(
initialLocation: '/splash', initialLocation: '/splash',
refreshListenable: authRefreshNotifier, refreshListenable: authRefreshNotifier,
observers: [UmamiAnalytics.navigationObserver], observers: [
UmamiAnalytics.navigationObserver,
FirebaseAnalyticsConfig.navigationObserver,
],
redirect: (context, state) { redirect: (context, state) {
final authState = ref.read(authProvider); final authState = ref.read(authProvider);
final isAuthenticated = authState.status == AuthStatus.authenticated; final isAuthenticated = authState.status == AuthStatus.authenticated;

View File

@@ -10,6 +10,7 @@ import device_info_plus
import emoji_picker_flutter import emoji_picker_flutter
import facebook_auth_desktop import facebook_auth_desktop
import file_selector_macos import file_selector_macos
import firebase_analytics
import firebase_core import firebase_core
import firebase_messaging import firebase_messaging
import flutter_local_notifications import flutter_local_notifications
@@ -29,6 +30,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin"))
FacebookAuthDesktopPlugin.register(with: registry.registrar(forPlugin: "FacebookAuthDesktopPlugin")) FacebookAuthDesktopPlugin.register(with: registry.registrar(forPlugin: "FacebookAuthDesktopPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FirebaseAnalyticsPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))

View File

@@ -393,6 +393,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.9.3+5" version: "0.9.3+5"
firebase_analytics:
dependency: "direct main"
description:
name: firebase_analytics
sha256: "4f85b161772e1d54a66893ef131c0a44bd9e552efa78b33d5f4f60d2caa5c8a3"
url: "https://pub.dev"
source: hosted
version: "11.6.0"
firebase_analytics_platform_interface:
dependency: transitive
description:
name: firebase_analytics_platform_interface
sha256: a44b6d1155ed5cae7641e3de7163111cfd9f6f6c954ca916dc6a3bdfa86bf845
url: "https://pub.dev"
source: hosted
version: "4.4.3"
firebase_analytics_web:
dependency: transitive
description:
name: firebase_analytics_web
sha256: c7d1ed1f86ae64215757518af5576ff88341c8ce5741988c05cc3b2e07b0b273
url: "https://pub.dev"
source: hosted
version: "0.5.10+16"
firebase_core: firebase_core:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@@ -71,6 +71,9 @@ dependencies:
# Microsoft Clarity (session recording / heatmaps) # Microsoft Clarity (session recording / heatmaps)
clarity_flutter: ^1.8.0 clarity_flutter: ^1.8.0
# Google Analytics (via Firebase Analytics — feeds the linked GA4 property)
firebase_analytics: ^11.3.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter