{"id":29930356,"url":"https://github.com/sayedmoataz/firebase_analytics_services","last_synced_at":"2026-07-01T19:31:37.075Z","repository":{"id":304368854,"uuid":"1018591602","full_name":"sayedmoataz/firebase_analytics_services","owner":"sayedmoataz","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-12T16:33:23.000Z","size":10,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-10T15:05:01.951Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sayedmoataz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-12T15:39:48.000Z","updated_at":"2025-07-12T19:04:34.000Z","dependencies_parsed_at":"2025-07-12T18:07:17.058Z","dependency_job_id":null,"html_url":"https://github.com/sayedmoataz/firebase_analytics_services","commit_stats":null,"previous_names":["sayedmoataz/firebase_analytics_services"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sayedmoataz/firebase_analytics_services","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayedmoataz%2Ffirebase_analytics_services","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayedmoataz%2Ffirebase_analytics_services/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayedmoataz%2Ffirebase_analytics_services/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayedmoataz%2Ffirebase_analytics_services/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sayedmoataz","download_url":"https://codeload.github.com/sayedmoataz/firebase_analytics_services/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayedmoataz%2Ffirebase_analytics_services/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35020869,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-02T16:13:40.425Z","updated_at":"2026-07-01T19:31:37.056Z","avatar_url":"https://github.com/sayedmoataz.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Firebase Analytics Module for Flutter\n\nA clean and extensible Firebase Analytics module built for Flutter apps using dependency injection and event abstraction. This package helps you track user behavior, screen views, and custom events in a scalable and testable way.\n\n---\n\n## ✨ Features\n\n- ✅ Clean architecture (models, services, helpers, extensions)\n- ✅ Easy-to-use event extensions\n- ✅ No analytics logic in the UI\n- ✅ Automatic user context injection (ID, email, role…)\n- ✅ Custom and screen view event abstraction\n- ✅ Dependency Injection ready (via `getIt`)\n- ✅ Error-safe logging using Crashlytics\n- ✅ Lightweight and easily customizable\n- ✅ Type-safe parameter handling\n- ✅ Easy to extend for any custom use case\n- ℹ️ Note: Crashlytics and GetIt are optional. You can replace them with any other error logger or DI framework.\n\n\n---\n\n## 📦 Installation\n\nIn your `pubspec.yaml`:\n\n```yaml\ndependencies:\n  firebase_core: ^3.13.0\n  firebase_analytics: ^11.5.0\n````\n\n---\n\n## 🔧 Setup\n\n### 1. Initialize Firebase\n\n```dart\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await Firebase.initializeApp();\n  setupDependencies(); // Register your dependencies (or use your own DI method)\n  runApp(MyApp());\n}\n```\n\n---\n\n### 2. Dependency Injection (GetIt)\n\n```dart\nfinal getIt = GetIt.instance;\n\nvoid setupDependencies() {\n  final sharedPreferences = await SharedPreferences.getInstance();\n  getIt.registerSingleton\u003cSharedPreferences\u003e(sharedPreferences);\n  getIt.registerSingleton\u003cPrefManager\u003e(PrefManager(sharedPreferences));\n  getIt.registerSingleton\u003cFirebaseCrashlytics\u003e(FirebaseCrashlytics.instance);\n  getIt.registerLazySingleton\u003cAnalyticsHelper\u003e(AnalyticsHelper.new);\n  getIt.registerLazySingleton\u003cIAnalyticsService\u003e(FirebaseAnalyticsService.new);\n}\n```\n\n---\n\n### 3. Use Navigator Observer\n\n```dart\nMaterialApp(\n  navigatorObservers: [\n    NavigationService.routeObserver,\n    (getIt\u003cIAnalyticsService\u003e() as FirebaseAnalyticsService).observer,\n  ],\n  home: MyHomePage(),\n);\n```\n\n---\n\n## 🚀 Usage Examples\n\n### Log a login event:\n\n```dart\nawait getIt\u003cIAnalyticsService\u003e().logLogin(method: 'social_login');\n```\n\n---\n\n### Log a custom event:\n\n```dart\nawait getIt\u003cIAnalyticsService\u003e().logUpdateProfile(parameters: {\n  'field_changed': 'username',\n});\n```\n\n---\n\n### Log a screen view manually:\n\n```dart\nawait getIt\u003cIAnalyticsService\u003e().radarAROpenView(\n  screenClass: 'RadarScreen',\n  parameters: {'source': 'dashboard'},\n);\n```\n\n---\n\n### Set user context manually:\n\n```dart\nawait getIt\u003cIAnalyticsService\u003e().setUserContext(UserContext(\n  userId: 'user_123',\n  userName: 'Sayed Moataz',\n  userEmail: 'sayedmoataz9@gmail.com',\n  userPhone: '+201147880178',\n  userRole: 'admin',\n));\n```\n\n## 📁 Project Structure\n\n```\nlib/\n├── services \n│   └── analytics/\n│       ├── analytics_helper.dart\n│       ├── analytics_services.dart\n│       └── analytics_extensions.dart\n├── models/\n│   └── user_context.dart\n├── di.dart\n└── main.dart\n```\n\n---\n\n## 🛠️ Extend the Module\n\nYou can add more events in the `AnalyticsServiceExtensions`:\n\n```dart\nextension AnalyticsServiceExtensions on IAnalyticsService {\n  Future\u003cvoid\u003e logPurchase({required double amount}) async {\n    final helper = getIt\u003cAnalyticsHelper\u003e();\n    await logEvent(\n      helper.createCustomEvent(\n        eventName: 'purchase_made',\n        parameters: {'amount': amount},\n      ),\n    );\n  }\n}\n```\n\n---\n## 🧩 Customization Notes\n\nThis module is designed to be flexible and easy to adapt to your project:\n\n- **Crashlytics Logging**  \n  The `CrashlyticsLogger.logMessage(...)` calls are project-specific.  \n  You can:\n  - Replace them with your own logger\n  - Remove them entirely\n\n- **Dependency Injection**  \n  Although `getIt` is used here for DI, you're free to:\n  - Use any other DI solution (like Riverpod, Provider, injectable, etc.)\n  - Inject dependencies manually based on your app architecture\n\nThese components are decoupled from the core logic to allow maximum flexibility.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayedmoataz%2Ffirebase_analytics_services","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsayedmoataz%2Ffirebase_analytics_services","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayedmoataz%2Ffirebase_analytics_services/lists"}