flutterandroidios
dart
npx skills add dhruvanbhalara/skills --skill flutter-firebase
Firebase Setup
- Use
firebase_core for initialization β call Firebase.initializeApp() before runApp()
- Use
flutterfire configure for platform-specific setup
- Use separate Firebase projects per flavor (see
app-config skill)
- Register Firebase services via
injectable for consistent DI
Authentication
- Use
firebase_auth for user management
- Wrap all auth calls in an
AuthRepository β no direct FirebaseAuth usage in BLoCs or UI
- Support email/password, Google Sign-In, and Apple Sign-In at minimum
- Handle auth state changes via
FirebaseAuth.instance.authStateChanges() stream in AuthBloc
- Store auth tokens via
flutter_secure_storage β never in SharedPreferences or source code
- Implement proper sign-out: clear local cache, navigate to login, dispose user-specific BLoCs
Firestore
- Use
cloud_firestore for remote data persistence
- DataSources wrap all Firestore calls (
get, set, update, delete, snapshots)
- Use typed model classes with
fromFirestore / toFirestore factory methods
- Prefer
.withConverter<T>() for type-safe collection references
- Use batch writes for multi-document operations β never multiple sequential writes
- Implement offline persistence (enabled by default on mobile)
Security Rules
- NEVER rely on client-side validation alone β enforce rules in Firestore Security Rules
- Default deny: start with
allow read, write: if false; and open only whatβs needed
- Always validate
request.auth != null for authenticated-only collections
- Test rules with the Firebase Emulator Suite before deploying
Push Notifications (FCM)
- Use
firebase_messaging for push notifications
- Request notification permissions early but gracefully (explain value before requesting)
- Handle foreground, background, and terminated-state messages separately
- Store FCM token in Firestore user document for server-side targeting
- Re-register token on
onTokenRefresh stream
Crashlytics
- Use
firebase_crashlytics for crash reporting
- Enable in staging and production flavors only β disable in dev
- Record Flutter errors:
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError
- Catch async errors via
PlatformDispatcher.instance.onError
- Add custom keys for user context:
Crashlytics.instance.setCustomKey('userId', id)
Analytics
- Use
firebase_analytics for user behavior tracking
- Log meaningful events with descriptive names:
analytics.logEvent(name: 'purchase_completed')
- Set user properties for segmentation:
analytics.setUserProperty(name: 'plan', value: 'premium')
- Track screen views via
FirebaseAnalyticsObserver in GoRouter
- NEVER log PII (emails, passwords, phone numbers) in analytics events
Remote Config
- Use
firebase_remote_config for feature flags and A/B testing
- Set sensible defaults locally β app MUST work without Remote Config fetched
- Fetch and activate on app start with a timeout fallback
- Cache values and respect minimum fetch intervals to avoid throttling