Toolset · Dart, Riverpod, single codebase
Flutter
- Dart
- Flutter
- Riverpod
Flutter gives one codebase across iOS and Android. Our stack keeps state predictable, storage transactional, and secrets off the device filesystem — the failure modes that bite cross-platform apps hardest.
Where two tools compete, the one marked our default is what we reach for.
Build & dependencies
1 toolDart's package manager and registry; dependencies declared in pubspec.yaml. Pin versions and audit transitive packages.
Dependency injection
1 toolA service locator (get_it) plus optional codegen (injectable) for registration. Our default — simple and testable.
final getIt = GetIt.instance;
void setup() {
getIt.registerLazySingleton<ApiClient>(() => ApiClient());
getIt.registerFactory<UserRepository>(() => UserRepository(getIt()));
}
// use: final repo = getIt<UserRepository>();State management
2 toolsCompile-safe, testable state management without BuildContext coupling. Our default.
Event-driven, highly structured state management with strict separation of events and states — excellent for complex enterprise flows and large teams where business logic is heavily documented. The trade-off is verbosity and a steeper learning curve that can slow simpler features. Decision rule: start with Riverpod for its compile safety, testability, and simpler mental model; choose Bloc only for large teams or extremely complex business logic that benefits from its strict event-sourcing architecture.
Networking
2 toolsPush notifications
1 toolOne API over both FCM (Android) and APNs (iOS) — handle onMessage, onBackgroundMessage, and onResume, with the platform setup each side needs (google-services.json for Android, GoogleService-Info.plist for iOS). Route to the right screen on payload tap via GoRouter. Our default.
Local storage
2 toolsSecurity
3 toolsOur default wrapper over the platform secure stores — Android Keystore (API 23+) and iOS Keychain (kSecClassGenericPassword) — for tokens and secrets. On Android it uses EncryptedSharedPreferences (API 23+) and falls back to AES-encrypted SharedPreferences pre-API 23; that fallback is a known limitation any deployment targeting older APIs must plan around.
For application-level encryption beyond token storage — hashing, AES-GCM, and public-key operations in pure Dart. Reach for these when the app itself needs to encrypt data or verify signatures.
Pin the server's public-key hash via dio interceptors or http_certificate_pinning, and keep a fallback pin so certificate rotation doesn't lock users out.
Serialization & navigation
2 toolsImmutable models, unions, and JSON codegen. Our default for data classes.
Declarative, deep-link-friendly routing.
Testing
2 toolsWidget/unit tests with null-safe mocking. Our default.
First-party end-to-end tests on a real device/emulator.
Background work
2 toolsPeriodic and one-off background tasks (sync, cleanup, analytics) mapped onto the platform schedulers — iOS background fetch and Android WorkManager, each with their own constraints. Our default.
Offload heavy work off the UI thread — use compute for a one-shot job or Isolate.spawn for a long-lived worker. Never block the main isolate.
Monitoring & observability
4 toolsCrash reporting for Flutter on iOS and Android; record Dart errors and native crashes together. Our default.
Crashes, performance, and error monitoring across Flutter with a single SDK and dashboard.
Automatic and custom performance traces — app start, network calls, and screen rendering.
Timeline, memory, and widget-inspector profiling in development.
CI/CD
4 toolsCI for analyze / test / build; cache pub and the Flutter SDK. Our default CI.
Flutter-specialised CI/CD with signing and store publishing built in.
Store deployment automation for the iOS and Android outputs.
Beta builds to testers on both platforms.
Linting & formatting
3 toolsThe built-in analyzer with the recommended lint set enabled. Our default.
The official, zero-config formatter. Our default for formatting.
A stricter lint ruleset when you want more rigour.
Building on Flutter?
We ship production Flutterwith exactly this stack. Tell us what you're building.
Start a conversation