flutter_analytics_manager 1.0.1
flutter_analytics_manager: ^1.0.1 copied to clipboard
A comprehensive Flutter analytics manager package with Firebase Analytics and Mixpanel support.
Flutter Analytics Manager #
A comprehensive Flutter analytics manager package that provides a clean, type-safe interface for analytics tracking across multiple analytics services simultaneously. Support for Firebase Analytics, Mixpanel, and custom analytics implementations with proper dependency injection and Clean Architecture principles.
Features #
✅ Multi-Service Support: Use Firebase Analytics, Mixpanel, and custom services simultaneously ✅ Type-Safe: Full TypeScript-like safety with proper data models ✅ Clean Architecture: Proper dependency injection and separation of concerns ✅ Comprehensive Logging: Built-in logging with app_logger_manager integration ✅ Event Validation: Automatic sanitization and validation of events and parameters ✅ Privacy Controls: Built-in PII filtering and GDPR compliance features ✅ Session Management: Automatic session tracking and management ✅ Error Handling: Robust error handling with fallback mechanisms ✅ Utility Functions: Pre-built utility functions for common analytics events ✅ Offline Support: Queue events when offline and sync when online ✅ Performance Optimized: Efficient batching and throttling mechanisms ✅ Highly Testable: Easy to mock and unit test with dependency injection
Installation #
Add this package to your pubspec.yaml
:
dependencies:
flutter_analytics_manager: ^1.0.1
app_logger_manager: ^1.0.1
# For Firebase Analytics
firebase_analytics: ^11.5.0
firebase_core: ^3.14.0
# For Mixpanel
mixpanel_flutter: ^2.4.4
Quick Start #
1. Basic Setup with Dependency Injection #
import 'package:flutter_analytics_manager/flutter_analytics_manager.dart';
import 'package:app_logger_manager/app_logger_manager.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:mixpanel_flutter/mixpanel_flutter.dart';
// Create logger
final logger = AppLoggerImpl();
// Initialize Firebase (if using Firebase Analytics)
await Firebase.initializeApp();
// Create analytics managers using dependency injection
final firebaseAnalytics = FirebaseAnalytics.instance;
final firebaseManager = FirebaseAnalyticsManager(
analytics: firebaseAnalytics,
logger: logger,
);
await firebaseManager.initialize();
final mixpanel = await Mixpanel.init('YOUR_MIXPANEL_PROJECT_TOKEN');
final mixpanelManager = MixpanelAnalyticsManager(
mixpanel: mixpanel,
logger: logger,
);
await mixpanelManager.initialize();
// Create multi-analytics manager
final analyticsManager = await MultiAnalyticsManager.create(
managers: [firebaseManager, mixpanelManager],
logger: logger,
continueOnError: true,
);
2. Track Events #
// Track a simple event
await analyticsManager.trackEvent(AnalyticsEvent(
name: 'button_click',
eventType: AnalyticsEventType.userEngagement,
timestamp: DateTime.now(),
parameters: {
'button_name': 'login_button',
'screen_name': 'home',
},
));
// Track using utility functions
final loginEvent = AnalyticsUtilities.createLoginEvent(
method: 'email',
userId: 'user_123',
additionalParameters: {'campaign': 'summer_sale'},
);
await analyticsManager.trackEvent(loginEvent);
3. Screen Tracking #
// Track screen views
await analyticsManager.trackScreenView(
screenName: 'home_screen',
screenClass: 'HomePage',
parameters: {
'previous_screen': 'splash',
'load_time': 1250,
},
);
4. User Properties #
// Set user properties
final userProperties = UserProperties(
userId: 'user_123',
name: 'John Doe',
email: 'john@example.com',
age: 25,
customProperties: {
'subscription_plan': 'premium',
'signup_date': DateTime.now().toIso8601String(),
},
);
await analyticsManager.setUserProperties(userProperties);
Firebase Analytics Setup #
Android Setup #
- Add your
google-services.json
file toandroid/app/
- Update
android/build.gradle
:
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.4.2'
}
}
- Update
android/app/build.gradle
:
apply plugin: 'com.google.gms.google-services'
dependencies {
implementation platform('com.google.firebase:firebase-bom:33.4.0')
implementation 'com.google.firebase:firebase-analytics'
}
iOS Setup #
- Add your
GoogleService-Info.plist
file toios/Runner/
- Update
ios/Runner/Info.plist
:
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
- Initialize in
ios/Runner/AppDelegate.swift
:
import UIKit
import Flutter
import Firebase
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
Mixpanel Setup #
- Get your project token from Mixpanel Dashboard
- Initialize Mixpanel manager:
final mixpanel = await Mixpanel.init('YOUR_PROJECT_TOKEN_HERE');
final mixpanelManager = MixpanelAnalyticsManager(
mixpanel: mixpanel,
logger: logger,
);
await mixpanelManager.initialize();
Advanced Usage #
Dependency Injection Benefits #
The package now uses proper dependency injection, providing several benefits:
- Better Testability: Easy to mock Firebase Analytics and Mixpanel instances
- Separation of Concerns: Analytics managers only handle analytics, not SDK initialization
- Flexible Configuration: Full control over SDK initialization
- Consistent Architecture: Same pattern across all analytics managers
Advanced Firebase Configuration #
// Custom Firebase app
await Firebase.initializeApp(
name: 'myCustomApp',
options: FirebaseOptions(
apiKey: 'your-api-key',
appId: 'your-app-id',
messagingSenderId: 'your-sender-id',
projectId: 'your-project-id',
),
);
final analytics = FirebaseAnalytics.instanceFor(
app: Firebase.app('myCustomApp'),
);
final firebaseManager = FirebaseAnalyticsManager(
analytics: analytics,
logger: logger,
);
Advanced Mixpanel Configuration #
// Mixpanel with custom settings
final mixpanel = await Mixpanel.init(
'your-project-token',
trackAutomaticEvents: false, // Privacy-focused
);
final mixpanelManager = MixpanelAnalyticsManager(
mixpanel: mixpanel,
logger: logger,
);
Custom Analytics Service #
Create your own analytics implementation:
class CustomAnalyticsManager implements AnalyticsManager {
const CustomAnalyticsManager({
required this.logger,
});
final AppLogger logger;
@override
Future<void> trackEvent(AnalyticsEvent event) async {
// Your custom implementation
logger.info('Custom Analytics: ${event.name}');
}
// ... implement other methods
}
Testing with Mocks #
// Easy to test with dependency injection
final mockFirebaseAnalytics = MockFirebaseAnalytics();
final mockMixpanel = MockMixpanel();
final mockLogger = MockAppLogger();
final firebaseManager = FirebaseAnalyticsManager(
analytics: mockFirebaseAnalytics,
logger: mockLogger,
);
final mixpanelManager = MixpanelAnalyticsManager(
mixpanel: mockMixpanel,
logger: mockLogger,
);
// Test your analytics logic without external dependencies
Event Filtering #
// Filter sensitive data
final filteredParams = AnalyticsUtilities.filterSensitiveParameters(
eventParameters,
sensitiveKeys: ['password', 'ssn', 'credit_card'],
);
Global Parameters #
// Set global parameters sent with every event
analyticsManager.setGlobalParameters({
'app_version': '1.0.0',
'platform': 'flutter',
'user_type': 'premium',
});
Session Management #
// Start new session
await analyticsManager.startNewSession();
// End current session
await analyticsManager.endSession();
// Set custom session ID
await analyticsManager.setSessionId('custom_session_123');
Utility Functions #
The package provides utility functions for common events:
// Login event
final loginEvent = AnalyticsUtilities.createLoginEvent(
method: 'google',
userId: 'user_123',
);
// Button click event
final buttonEvent = AnalyticsUtilities.createButtonClickEvent(
buttonName: 'purchase_button',
screenName: 'product_page',
);
// Performance event
final perfEvent = AnalyticsUtilities.createPerformanceEvent(
operation: 'api_call',
duration: Duration(milliseconds: 850),
);
// Error event
final errorEvent = AnalyticsUtilities.createErrorEvent(
errorMessage: 'Network timeout',
errorCode: 'NET_001',
);
// Search event
final searchEvent = AnalyticsUtilities.createSearchEvent(
searchTerm: 'flutter analytics',
resultCount: 42,
);
Event Types #
Available event types:
AnalyticsEventType.screenView
- Screen navigation eventsAnalyticsEventType.userEngagement
- User interaction eventsAnalyticsEventType.purchase
- E-commerce and purchase eventsAnalyticsEventType.custom
- Custom application eventsAnalyticsEventType.conversion
- Conversion and goal eventsAnalyticsEventType.userProperty
- User property change events
Error Handling #
The package includes comprehensive error handling:
final analyticsManager = MultiAnalyticsManager(
managers: [firebaseManager, mixpanelManager],
continueOnError: true, // Continue if one service fails
);
// Individual service error handling
try {
await analyticsManager.trackEvent(event);
} catch (e) {
// Handle analytics errors
print('Analytics error: $e');
}
Privacy and GDPR Compliance #
Disable Analytics #
// Disable all analytics tracking
await analyticsManager.setAnalyticsEnabled(false);
// Check if analytics is enabled
if (analyticsManager.isAnalyticsEnabled) {
// Track events
}
Reset User Data #
// Reset all user data (for logout/GDPR compliance)
await analyticsManager.resetUserData();
Filter Sensitive Data #
// Automatically filter sensitive parameters
final safeParams = AnalyticsUtilities.filterSensitiveParameters(
originalParameters,
sensitiveKeys: ['email', 'phone', 'address'],
);
Testing #
For testing, use the debug analytics manager:
final debugManager = DebugAnalyticsManager(logger); // Logs to console
final analyticsManager = MultiAnalyticsManager(
managers: [debugManager],
);
Performance Tips #
- Batch Events: Use
trackEvents()
for multiple events - Global Parameters: Set common parameters globally instead of per event
- Event Throttling: Use built-in throttling for high-frequency events
- Offline Handling: Events are queued when offline and sent when reconnected
Migration from v1.0.0 #
If you're upgrading from v1.0.0, you'll need to update your initialization code:
// OLD (v1.0.0) - Factory constructors
final firebaseManager = await FirebaseAnalyticsManager.create(logger: logger);
final mixpanelManager = await MixpanelAnalyticsManager.create(
projectToken: 'token',
logger: logger,
);
// NEW (v1.0.1) - Dependency injection
final firebaseAnalytics = FirebaseAnalytics.instance;
final firebaseManager = FirebaseAnalyticsManager(
analytics: firebaseAnalytics,
logger: logger,
);
await firebaseManager.initialize();
final mixpanel = await Mixpanel.init('token');
final mixpanelManager = MixpanelAnalyticsManager(
mixpanel: mixpanel,
logger: logger,
);
await mixpanelManager.initialize();
Troubleshooting #
Firebase Analytics Not Working #
- Verify
google-services.json
/GoogleService-Info.plist
are properly added - Check Firebase project configuration
- Ensure proper initialization in platform-specific code
- Debug events may take 24-48 hours to appear in Firebase console
Mixpanel Not Working #
- Verify project token is correct
- Check network connectivity
- Use flush() to force immediate sending for testing
Common Issues #
- Events not appearing: Check if analytics is enabled and properly initialized
- Parameter validation errors: Use utility functions to sanitize parameters
- Memory leaks: Always call
dispose()
when done
Contributing #
Contributions are welcome! Please read our contributing guidelines before submitting PRs.
License #
This project is licensed under the MIT License - see the LICENSE file for details.
Support #
For support, please:
- Check the documentation
- Search existing issues
- Create a new issue with reproduction steps
Changelog #
See CHANGELOG.md for version history and breaking changes.