Infobits Flutter SDK
A privacy-focused, comprehensive analytics, logging, error tracking, and performance monitoring SDK for Flutter applications. Infobits provides powerful insights while respecting user privacy - no user identification, no session tracking, just actionable aggregate data.
Features
- 📊 Privacy-Focused Analytics - Track events and conversions without user identification
- 📝 Advanced Logging - Multi-level logging with local and remote storage
- 🐛 Error Tracking - Comprehensive error capture with stack traces and breadcrumbs
- ⚡ Performance Monitoring - Built-in benchmarking and performance tracking
- 🔄 Offline Support - Queue events and logs for later transmission
- 🎯 Crash Reporting - Automatic crash detection and reporting
- 🏗️ Developer Friendly - Simple API, great documentation, and testing utilities
Quick Start
Installation
Add infobits
to your pubspec.yaml
:
flutter pub add infobits
Basic Setup
The simplest way to get started is using runWithInfobits
:
import 'package:infobits/infobits.dart';
void main() {
runWithInfobits(
app: MyApp(),
apiKey: 'your-api-key', // Optional - for remote logging
domain: 'your-app.com', // Required with API key
debug: true, // Enable debug mode
);
}
Alternative Setup
For more control over initialization:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Infobits.initialize(
apiKey: 'your-api-key', // Optional
domain: 'your-app.com',
analyticsEnabled: true,
loggingEnabled: true,
loggingOptions: LoggingOptions.development(),
);
runApp(MyApp());
}
Local-Only Mode
Infobits works perfectly without an API key for local development:
void main() {
runWithInfobits(app: MyApp());
// All logging will work locally in console
}
Usage
Analytics
Track custom events with properties:
// Track simple events
InfobitsAnalytics.instance.trackEvent('button_clicked');
// Track events with properties
InfobitsAnalytics.instance.trackEvent(
'purchase_completed',
properties: {
'amount': 99.99,
'currency': 'USD',
'items': ['item1', 'item2'],
},
);
// Track revenue
InfobitsAnalytics.instance.trackRevenue(
99.99,
currency: 'USD',
properties: {
'product': 'Premium Plan',
'payment_method': 'credit_card',
},
);
// Track conversions
InfobitsAnalytics.instance.trackConversion(
'signup',
properties: {
'source': 'organic',
'plan': 'free',
},
);
Navigation Tracking
Automatically track screen views:
MaterialApp(
navigatorObservers: [
InfobitsAnalyticsObserver(),
],
// ...
);
Or manually track views:
InfobitsAnalytics.instance.startView('/home');
// ... when leaving the view
InfobitsAnalytics.instance.endView('/home');
Logging
Multiple log levels for different scenarios:
// Simple logging
Logger.debug('User clicked button');
Logger.info('Payment processed successfully');
Logger.warn('API rate limit approaching');
Logger.error('Failed to load user data');
// Logging with additional context
Logger.error(
'Network request failed',
exception: error,
information: stackTrace.toString(),
);
// Structured logging with metadata
Logger.info(
'Order processed',
metadata: {
'order_id': '12345',
'amount': 99.99,
'items_count': 3,
},
);
Error Tracking
Errors are automatically captured when using runWithInfobits
. You can also manually track errors:
try {
// Your code
} catch (error, stackTrace) {
Logger.error(
'Operation failed',
exception: error,
information: stackTrace.toString(),
);
}
Breadcrumbs
Track user actions leading up to errors:
// Add breadcrumbs for debugging
Infobits.addBreadcrumb(
'user_action',
data: {'button': 'submit', 'form': 'signup'},
);
// Breadcrumbs are automatically included with errors
Performance Monitoring
Built-in benchmarking for performance tracking:
// Simple benchmark
final timer = Infobits.benchmark.start('api_call');
await makeApiCall();
timer.stop();
// Benchmark with async/await
final result = await Infobits.benchmark.run(
'database_query',
() async {
return await database.query('SELECT * FROM users');
},
);
// Nested benchmarks
final parentTimer = Infobits.benchmark.start('checkout_flow');
final paymentTimer = Infobits.benchmark.start('payment_processing');
await processPayment();
paymentTimer.stop();
final shippingTimer = Infobits.benchmark.start('shipping_calculation');
await calculateShipping();
shippingTimer.stop();
parentTimer.stop();
Configuration
Logging Options
Customize logging behavior:
// Development configuration
LoggingOptions.development(
printToConsole: true,
prettyPrint: true,
includeStackTrace: true,
);
// Production configuration
LoggingOptions.production(
printToConsole: false,
minLevel: LogLevel.warning,
);
// Custom configuration
LoggingOptions(
filter: MyCustomFilter(),
printer: MyCustomPrinter(),
output: MultiOutput([
ConsoleOutput(),
FileOutput('app.log'),
]),
);
Global Properties
Set properties that are included with all events:
InfobitsAnalytics.instance.setGlobalProperties({
'app_version': '1.2.3',
'environment': 'production',
'platform': Platform.operatingSystem,
});
Testing
Infobits provides testing utilities for unit tests:
import 'package:infobits/testing.dart';
void main() {
test('tracks events correctly', () {
// Use mock implementation
final mockAnalytics = MockInfobitsAnalytics();
// Your test code
myFunction();
// Verify events were tracked
expect(mockAnalytics.trackedEvents, contains('button_clicked'));
});
}
Privacy & Compliance
Infobits is designed with privacy in mind:
- ✅ No user identification or tracking
- ✅ No session tracking
- ✅ No personal data collection
- ✅ GDPR compliant by design
- ✅ No third-party data sharing
- ✅ All data is aggregated and anonymous
Platform Support
Platform | Supported | Notes |
---|---|---|
Android | ✅ | Full support |
iOS | ✅ | Full support |
Web | ✅ | Full support |
macOS | ✅ | Full support |
Windows | ✅ | Full support |
Linux | ✅ | Full support |
Examples
Check out the example directory for a complete sample application demonstrating all features.
API Reference
For detailed API documentation, visit pub.dev/documentation/infobits.
Migration Guide
From Google Analytics
// Before (Google Analytics)
await FirebaseAnalytics.instance.logEvent(
name: 'purchase',
parameters: {'value': 99.99},
);
// After (Infobits)
InfobitsAnalytics.instance.trackEvent(
'purchase',
properties: {'value': 99.99},
);
From Sentry
// Before (Sentry)
await Sentry.captureException(error, stackTrace: stackTrace);
// After (Infobits)
Logger.error('Error occurred', exception: error, information: stackTrace.toString());
Troubleshooting
Events not appearing?
- Check if analytics is enabled:
Infobits.canTrack
- Verify API key and domain are correct
- Check debug logs for any errors
Logs not showing?
- Verify logging is enabled:
Infobits.canLog
- Check log level settings in
LoggingOptions
- Ensure console output is enabled in development
Contributing
We welcome contributions! Please see our Contributing Guide for details.
Support
- 📧 Email: support@infobits.io
- 💬 Discord: Join our community
- 🐛 Issues: GitHub Issues
License
This project is licensed under the BSD 3-Clause License - see the LICENSE file for details.
Acknowledgments
Built with ❤️ by the Infobits team for the Flutter community.