← Abdelrahman Saed

Flutter Reference

An in-depth Flutter reference built from production experience at 5M+ users — definitions, head-to-head comparisons, curated package directories, and architecture guides.

Glossary

State Management

  • BLoC — BLoC (Business Logic Component) is a reactive state management pattern for Flutter that uses streams to separate business logic from UI. Learn how it works and when to use it.
  • Cubit — Cubit is a lightweight variant of the BLoC pattern that replaces events with direct method calls. Simpler than BLoC, but the same testability and reactive model.
  • Riverpod — Riverpod is a reactive caching and state management framework for Flutter that improves on Provider with compile-time safety, no BuildContext dependency, and auto-dispose.
  • GetX — GetX is an all-in-one Flutter framework providing state management, dependency injection, route management, and utilities. Popular for rapid prototyping, controversial for production.
  • RxDart — RxDart extends Dart streams with powerful operators like debounce, throttle, switchMap, and combineLatest. Learn how it powers complex reactive flows in Flutter.

Architecture

  • Clean Architecture — Clean Architecture for Flutter separates an app into layers — presentation, domain, and data — so business logic is independent of frameworks, databases, and UI. Learn the pattern and its benefits.
  • Dependency Injection — Dependency injection in Flutter decouples object creation from usage. Learn how get_it, Provider, and injectable make your code testable, modular, and maintainable.
  • Modular Architecture — Modular architecture in Flutter splits the app into independent feature modules, each owning its own UI, logic, and data. Scales to 50+ modules at 5M-user scale.
  • Reactive Programming — Reactive programming in Flutter uses streams and observables to propagate change automatically. Learn how RxDart, BLoC, and StreamBuilder power reactive UIs.
  • Repository Pattern — The repository pattern abstracts data sources behind a single interface, so the app doesn't know or care where data comes from. Learn how to implement it in Flutter.
  • Either<Failure, T> Pattern — Either<Failure, T> is a functional error handling pattern that represents success (Right) or failure (Left) as a value — not an exception. Learn how it works and why it prevents crashes.

Data & Connectivity

  • Offline-First — Offline-first is a mobile architecture where the app reads and writes against a local database by default, treating the network as a background sync concern — not a prerequisite for UI.
  • Local-First — Local-first architecture makes the device's local database the authoritative source of truth. The server syncs in the background, but never blocks reads or writes.
  • PowerSync — PowerSync is a sync engine that keeps a local SQLite database in sync with a Postgres backend, enabling offline-first Flutter apps with automatic conflict resolution.
  • Drift — Drift is a reactive SQLite ORM for Flutter with type-safe queries, code generation, and stream-based reactive queries. Learn how it powers offline-first apps.

CI/CD

  • Trunk-Based Development — Trunk-based development is a Git strategy where all developers merge to a single shared branch (master/main) frequently, keeping branches short-lived. It enables continuous integration and fast release cycles.
  • Feature Flags — Feature flags let you toggle functionality on or off remotely without a new app release. Learn how to decouple deploy from release in Flutter with GrowthBook, Firebase, and more.

Build & Release

  • Build Flavors — Build flavors in Flutter let you run multiple environments (dev, staging, production) from one codebase with different bundle IDs, icons, and configuration. Learn the full setup.

Quality

  • Crash-Free Rate — Crash-free rate is the percentage of sessions that complete without a crash. Learn what target to aim for (99.9%+), how to measure it, and how to maintain it at scale.
  • Sentry for Flutter — Sentry is a crash monitoring and performance tracing platform for Flutter apps. Learn how it captures Dart and native crashes, performance traces, and session replays.

State Management Comparisons

  • BLoC vs Riverpod — BLoC vs Riverpod for Flutter: a production-scale comparison of boilerplate, testing, debugging, and team adoption from a 5M-user codebase.
  • BLoC vs Cubit — BLoC vs Cubit: when the event-class ceremony is worth it and when Cubit's simpler API is the right call — from a team that runs both at 5M-user scale.
  • Riverpod vs Provider — Riverpod vs Provider: compile-time safety, no BuildContext dependency, and testability — why Riverpod replaced Provider in modern Flutter codebases.
  • BLoC vs GetX — BLoC vs GetX: architecture, testability, dependencies, and long-term maintainability — why production teams pick BLoC over GetX's all-in-one toolkit.
  • Riverpod vs BLoC — Riverpod vs BLoC performance: rebuild granularity, stream overhead, memory, and large-list scrolling — measured from a 5M-user Flutter app.

Data & Storage Comparisons

  • Drift vs Hive — Drift vs Hive: relational SQL with reactive queries vs key-value NoSQL — which to pick for offline-first Flutter, from a PowerSync+Drift production codebase.
  • Drift vs sqflite — Drift vs sqflite: type safety, reactive queries, migrations, and boilerplate — why production Flutter teams layer Drift over raw sqflite.

Data & Sync Comparisons

  • PowerSync vs Supabase — PowerSync vs Supabase: local-first SQLite sync vs a full Postgres backend — how they fit together in a 5M-user offline-first Flutter app.

Cross-Platform Comparisons

  • Flutter vs React Native — Flutter vs React Native: rendering, performance, talent, ecosystem, and long-term maintenance — from a senior mobile engineer leading a 5M-user Flutter app.
  • Flutter vs Kotlin Multiplatform — Flutter vs Kotlin Multiplatform: shared UI vs shared logic, native interop, and when KMP's business-logic-only model beats Flutter's full UI sharing.

Architecture Comparisons

  • Clean Architecture vs MVVM — Clean Architecture vs MVVM for Flutter: layering, testability, boilerplate, and which scales at 50+ modules — from a production squad lead.
  • Offline-First vs Local-First — Offline-first vs local-first: cloud-as-source-of-truth vs device-as-source-of-truth — the architectural decision that shapes your entire data layer.

CI/CD Comparisons

  • Fastlane vs Codemagic — Fastlane vs Codemagic for Flutter: local release automation vs managed CI — what a GitHub-Actions-native team picked and why.
  • GitHub Actions vs Codemagic — GitHub Actions vs Codemagic for Flutter: cost, iOS signing, control, and why a 5M-user app team standardized on GitHub Actions + Fastlane.

Growth Comparisons

  • Feature Flags vs A/B Testing — Feature flags vs A/B testing: release governance vs experimentation — what each is for and why conflating them causes bad decisions.

Testing Comparisons

  • Patrol vs Maestro — Patrol vs Maestro for Flutter integration tests: Dart-native vs YAML-based, custom finder vs accessibility, and which fits a Flutter-first team.

Networking Comparisons

  • Dio vs http — Dio vs http for Flutter: interceptors, cancellation, FormData, retries, and when the standard http package is enough — from a production networking layer.

Code Generation Comparisons

  • Freezed vs json_serializable — Freezed vs json_serializable: sealed unions, copyWith, equality, immutability — when Freezed's union modeling wins over plain JSON mapping.

Monetization Comparisons

  • RevenueCat vs Stripe — RevenueCat vs Stripe for Flutter: App Store/Play subscriptions vs custom payments — what a 5M-user app uses and why you likely need both.

Quality Comparisons

  • Sentry vs Firebase Crashlytics — Sentry vs Firebase Crashlytics for Flutter: grouping, release tracking, performance, source maps, and why a 5M-user app standardized on Sentry.

Best Flutter Packages

Architecture Guides


Available for hire. Abdelrahman Saed is a Senior Mobile Engineer (Flutter) — open to full-time, fractional, contract, or advisory work. Hire me →

Book a 20-minute call · Download the CV (PDF) · See how I work