Back to blog
April 15, 2024
5 min read

Firebase Predictions in Flutter

Predict user behavior with ML

Firebase Predictions in Flutter

Firebase Predictions uses machine learning to predict user behavior and help you make better decisions about your app. This guide will show you how to implement predictions in your Flutter applications.

Why Use Firebase Predictions?

Firebase Predictions offers several benefits:

  • User behavior prediction
  • Churn prediction
  • Purchase prediction
  • Custom predictions
  • Real-time updates
  • Easy integration
  • Free prediction solution

Implementation Steps

  1. Setup Dependencies

    # pubspec.yaml
    dependencies:
      firebase_core: ^2.24.2
      firebase_analytics: ^10.8.0
    
  2. Configure Firebase

    Android (android/app/src/main/AndroidManifest.xml):

    <manifest>
      <uses-permission android:name="android.permission.INTERNET"/>
    </manifest>
    
  3. Create Predictions Service

    class PredictionsService {
      final FirebaseAnalytics _analytics = FirebaseAnalytics.instance;
    
      // Log User Property
      Future<void> setUserProperty(String property, String value) async {
        try {
          await _analytics.setUserProperty(
            name: property,
            value: value,
          );
        } catch (e) {
          print('Error setting user property: $e');
        }
      }
    
      // Log Event
      Future<void> logEvent(String name, Map<String, dynamic> parameters) async {
        try {
          await _analytics.logEvent(
            name: name,
            parameters: parameters,
          );
        } catch (e) {
          print('Error logging event: $e');
        }
      }
    
      // Log User Engagement
      Future<void> logUserEngagement() async {
        try {
          await _analytics.logEvent(
            name: 'user_engagement',
            parameters: {
              'timestamp': DateTime.now().toIso8601String(),
            },
          );
        } catch (e) {
          print('Error logging user engagement: $e');
        }
      }
    
      // Log User Churn
      Future<void> logUserChurn() async {
        try {
          await _analytics.logEvent(
            name: 'user_churn',
            parameters: {
              'timestamp': DateTime.now().toIso8601String(),
            },
          );
        } catch (e) {
          print('Error logging user churn: $e');
        }
      }
    
      // Log User Purchase
      Future<void> logUserPurchase(double amount) async {
        try {
          await _analytics.logEvent(
            name: 'user_purchase',
            parameters: {
              'amount': amount,
              'timestamp': DateTime.now().toIso8601String(),
            },
          );
        } catch (e) {
          print('Error logging user purchase: $e');
        }
      }
    }
    
  4. Create Predictions Manager

    class PredictionsManager {
      final PredictionsService _predictionsService = PredictionsService();
    
      // Set User Properties
      Future<void> setUserProperties(Map<String, String> properties) async {
        for (final entry in properties.entries) {
          await _predictionsService.setUserProperty(
            entry.key,
            entry.value,
          );
        }
      }
    
      // Log User Behavior
      Future<void> logUserBehavior(String behavior) async {
        await _predictionsService.logEvent(
          'user_behavior',
          {
            'behavior': behavior,
            'timestamp': DateTime.now().toIso8601String(),
          },
        );
      }
    
      // Log User Engagement
      Future<void> logUserEngagement() async {
        await _predictionsService.logUserEngagement();
      }
    
      // Log User Churn
      Future<void> logUserChurn() async {
        await _predictionsService.logUserChurn();
      }
    
      // Log User Purchase
      Future<void> logUserPurchase(double amount) async {
        await _predictionsService.logUserPurchase(amount);
      }
    }
    
  5. Create Predictions UI

    class PredictionsScreen extends StatefulWidget {
      @override
      _PredictionsScreenState createState() => _PredictionsScreenState();
    }
    
    class _PredictionsScreenState extends State<PredictionsScreen> {
      final PredictionsManager _predictionsManager = PredictionsManager();
      bool _isLoading = false;
    
      Future<void> _logUserEngagement() async {
        setState(() {
          _isLoading = true;
        });
    
        try {
          await _predictionsManager.logUserEngagement();
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('User engagement logged')),
          );
        } catch (e) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Error logging user engagement: $e')),
          );
        } finally {
          setState(() {
            _isLoading = false;
          });
        }
      }
    
      Future<void> _logUserChurn() async {
        setState(() {
          _isLoading = true;
        });
    
        try {
          await _predictionsManager.logUserChurn();
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('User churn logged')),
          );
        } catch (e) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Error logging user churn: $e')),
          );
        } finally {
          setState(() {
            _isLoading = false;
          });
        }
      }
    
      Future<void> _logUserPurchase() async {
        setState(() {
          _isLoading = true;
        });
    
        try {
          await _predictionsManager.logUserPurchase(99.99);
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('User purchase logged')),
          );
        } catch (e) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Error logging user purchase: $e')),
          );
        } finally {
          setState(() {
            _isLoading = false;
          });
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Predictions Demo'),
          ),
          body: _isLoading
              ? Center(child: CircularProgressIndicator())
              : SingleChildScrollView(
                  padding: EdgeInsets.all(16),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        'Predictions Actions:',
                        style: Theme.of(context).textTheme.titleLarge,
                      ),
                      SizedBox(height: 24),
                      Center(
                        child: Column(
                          children: [
                            ElevatedButton(
                              onPressed: _logUserEngagement,
                              child: Text('Log User Engagement'),
                            ),
                            SizedBox(height: 16),
                            ElevatedButton(
                              onPressed: _logUserChurn,
                              child: Text('Log User Churn'),
                            ),
                            SizedBox(height: 16),
                            ElevatedButton(
                              onPressed: _logUserPurchase,
                              child: Text('Log User Purchase'),
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
        );
      }
    }
    

Advanced Features

  1. Custom Predictions

    class CustomPredictionsService {
      final FirebaseAnalytics _analytics = FirebaseAnalytics.instance;
    
      Future<void> logCustomPrediction(String prediction, double probability) async {
        await _analytics.logEvent(
          name: 'custom_prediction',
          parameters: {
            'prediction': prediction,
            'probability': probability,
            'timestamp': DateTime.now().toIso8601String(),
          },
        );
      }
    
      Future<void> logPredictionOutcome(String prediction, bool correct) async {
        await _analytics.logEvent(
          name: 'prediction_outcome',
          parameters: {
            'prediction': prediction,
            'correct': correct,
            'timestamp': DateTime.now().toIso8601String(),
          },
        );
      }
    }
    
  2. User Segmentation

    class UserSegmentationService {
      final FirebaseAnalytics _analytics = FirebaseAnalytics.instance;
    
      Future<void> setUserSegment(String segment) async {
        await _analytics.setUserProperty('user_segment', segment);
      }
    
      Future<void> setUserBehavior(String behavior) async {
        await _analytics.setUserProperty('user_behavior', behavior);
      }
    
      Future<void> setUserPreferences(Map<String, String> preferences) async {
        for (final entry in preferences.entries) {
          await _analytics.setUserProperty(entry.key, entry.value);
        }
      }
    }
    
  3. Prediction Analytics

    class PredictionAnalyticsService {
      final FirebaseAnalytics _analytics = FirebaseAnalytics.instance;
    
      Future<void> logPredictionAccuracy(String prediction, double accuracy) async {
        await _analytics.logEvent(
          name: 'prediction_accuracy',
          parameters: {
            'prediction': prediction,
            'accuracy': accuracy,
            'timestamp': DateTime.now().toIso8601String(),
          },
        );
      }
    
      Future<void> logPredictionImpact(String prediction, String impact) async {
        await _analytics.logEvent(
          name: 'prediction_impact',
          parameters: {
            'prediction': prediction,
            'impact': impact,
            'timestamp': DateTime.now().toIso8601String(),
          },
        );
      }
    }
    

Best Practices

  1. Data Collection

    • Relevant events
    • User properties
    • Timestamps
    • Context data
  2. Implementation

    • Error handling
    • Performance monitoring
    • Data validation
    • Analytics tracking
  3. User Experience

    • Privacy first
    • Clear communication
    • User control
    • Value delivery

Common Use Cases

  1. User Behavior

    • Engagement prediction
    • Churn prediction
    • Purchase prediction
    • Feature adoption
  2. Business Metrics

    • Revenue prediction
    • User growth
    • Retention rate
    • Conversion rate
  3. App Performance

    • Usage patterns
    • Feature popularity
    • User satisfaction
    • App health

Conclusion

Implementing Firebase Predictions in your Flutter application provides powerful machine learning capabilities. By following these guidelines and implementing the provided examples, you can create an effective prediction system that helps you make better decisions about your app.