PROPELOO

FLUTTER / CROSS-PLATFORM MOBILE

One codebase. Native performance. Both stores.

PROPELOO engineers Flutter applications — from architecture and widget design through platform channel integration, state management, CI/CD and Play Store + App Store delivery. Flutter is the best cross-platform option when done correctly. Done incorrectly, it produces apps that look like neither iOS nor Android.

Flutter is the only cross-platform framework that compiles to native ARM code and does not use a JavaScript bridge.

React Native uses a JavaScript bridge to communicate with native components — every JS-to-native call crosses this bridge, introducing latency. Flutter compiles Dart to native ARM code and renders via its own Skia/Impeller graphics engine — bypassing native components entirely. This means Flutter animations run at 60/120fps regardless of the native UI thread load. The tradeoff: Flutter widgets look like Flutter, not like iOS or Android. When designed well, this creates a consistent cross-platform experience. When designed carelessly, it produces apps that feel foreign on both platforms. PROPELOO uses platform-adaptive design patterns to make Flutter apps feel at home on each platform while sharing 95%+ of the codebase.

The Flutter engineering stack.

System Layers

  • UI Layer: Widgets, custom painters, animations, platform-adaptive design, responsive layouts
  • State Layer: Riverpod or Bloc/Cubit, clean architecture, repository pattern
  • Platform Layer: Platform channels for native APIs, method channels, event channels
  • Data Layer: Dio for HTTP, Drift (SQLite), Hive, secure storage, Freezed for models
  • DevOps Layer: Shorebird for code push, Codemagic/Fastlane CI/CD, both store distribution

Core Technical Capabilities

  • Clean Architecture

    Feature-first folder structure, Riverpod for state management, Repository pattern, Freezed for immutable models, injectable for DI and go_router for navigation.

  • Animations & Performance

    Implicit animations, explicit AnimationController, Rive for complex animations, CustomPainter for custom graphics, Impeller rendering engine and frame performance profiling.

  • Platform Channels

    MethodChannel for native code invocation (Swift/Kotlin), EventChannel for native streams, custom platform plugins for device-specific features not covered by pub.dev packages.

  • Responsive & Adaptive UI

    LayoutBuilder and MediaQuery for responsive layouts, platform-adaptive widgets (CupertinoApp for iOS feel, Material 3 for Android), different navigation patterns per platform.

  • Backend Integration

    Dio HTTP client with interceptors, JWT refresh, Retrofit-style type-safe API clients via dio_generator, WebSocket support, GraphQL via Ferry/Artemis.

  • CI/CD & Code Push

    Codemagic or GitHub Actions for automated builds, Shorebird for over-the-air Dart code updates (no store review), Fastlane for both store submissions.

How we think about Flutter.

Flutter is not "write once, run anywhere." It is "write once, adapt for each platform." The shared codebase is the business logic. The UI adapts.

  • Riverpod over Provider

    Riverpod 2.0 with code generation (riverpod_generator) is type-safe, testable and handles async state well. Provider is legacy. Bloc/Cubit is appropriate for large teams that prefer explicit state machine patterns.

    Axiom:

  • Platform-adaptive widgets matter

    DatePicker, alerts, navigation back gestures and share sheets behave differently on iOS and Android. Flutter has CupertinoDatePicker and CupertinoAlertDialog for iOS-specific patterns. Ignoring this creates an app that iOS users find jarring.

    Axiom:

  • Shorebird changes the release cadence

    Shorebird allows pushing Dart code updates to production without App Store or Play Store review — like React Native CodePush but for Flutter. Bug fixes ship in minutes, not days. This changes how you think about release quality gates.

    Axiom:

  • Web Flutter has specific limitations

    Flutter Web uses CanvasKit rendering which is heavier than HTML (4MB+ initial load). Not appropriate for SEO-important content. Best for web apps that are extensions of mobile apps — admin panels, dashboard views for existing Flutter mobile users.

    Axiom:

Flutter architecture decisions.

  • State management?

    Impact: Riverpod for most apps. Bloc for teams that want explicit state transitions and testability.

    • Riverpod 2.0 — type-safe, async-first, best default choice
    • Bloc/Cubit — explicit state machines, good for large teams
    • Provider — legacy, simpler but less powerful
    • GetX — opinionated, fast to start, hard to maintain at scale
  • Navigation?

    Impact: go_router is the standard — deep linking, web URL support, nested navigation and shell routes.

    • go_router — declarative, deep linking, Navigator 2.0, Google-maintained
    • AutoRoute — code generation, type-safe routes
    • Navigator 1.0 — simple, lacks deep linking
    • GetX routing — tied to GetX ecosystem
  • HTTP client?

    Impact: Dio with custom interceptors for auth refresh and logging. Type-safe generated clients via dio_generator for large API surfaces.

    • Dio — feature-rich, interceptors, FormData, most popular
    • http package — minimal, built-in, sufficient for simple needs
    • Chopper — generated type-safe clients
    • GraphQL (Ferry/Artemis) — for GraphQL backends
  • Local database?

    Impact: Drift for relational data with complex queries. Hive for simple fast key-value storage. flutter_secure_storage for sensitive data.

    • Drift (Moor) — type-safe SQLite, reactive queries
    • Hive — fast NoSQL, good for simple key-value
    • Isar — fast, works well with Flutter
    • sqflite — low-level SQLite, verbose
  • Code push updates?

    Impact: Shorebird for bug fixes that cannot wait for store review. $20/month for production apps. Cannot update native code or assets.

    • Shorebird — Dart-only code push, fast deployment
    • No code push — App/Play Store only
    • Firebase Remote Config — feature flags only, no code
    • Custom OTA — not feasible within store guidelines
  • Target platforms?

    Impact: iOS + Android for most apps. Add web only if your users need a web version and it is a dashboard/app extension, not a marketing/SEO site.

    • iOS + Android only — most common, 95%+ of market
    • iOS + Android + Web — Dart codebase extends to web, Web has limitations
    • All 6 (iOS/Android/Web/Windows/macOS/Linux) — rarely justified
    • Web only — use React/Next.js instead, Flutter Web is not the right tool

What PROPELOO builds.

  • Consumer App

    Beautiful cross-platform consumer app with shared business logic, platform-adaptive UI and both store deployment.

  • Fintech App

    Cross-platform banking or payment app with biometric auth, secure storage, certificate pinning and platform-native payment flows.

  • B2B Field App

    Offline-capable field operations app for sales/service teams — local SQLite sync, camera integration, map with offline tiles and MDM deployment.

  • IoT Control App

    Bluetooth LE device control app via platform channels, real-time data visualisation with CustomPainter and cross-platform BLE protocol implementation.

  • E-commerce App

    Product catalogue, cart, payment integration (Stripe/Razorpay Flutter SDKs), push notifications and deep linking from marketing campaigns.

  • Startup MVP

    Fast cross-platform MVP — shared Dart codebase targeting iOS and Android simultaneously, 40% faster than building two native apps.

The Flutter stack.

  • Core

    Stack: Flutter 3.x, Dart 3, Riverpod 2, go_router, Freezed

  • Data

    Stack: Dio, Drift, Hive, flutter_secure_storage, dio_generator

  • Platform

    Stack: flutter_local_notifications, firebase_messaging, geolocator, camera, flutter_blue_plus

  • Testing

    Stack: flutter_test, mocktail, integration_test, patrol

  • CI/CD

    Stack: Codemagic, GitHub Actions, Fastlane, Shorebird, Firebase App Distribution

  • Monitoring

    Stack: Firebase Crashlytics, Sentry, Firebase Analytics, Flutter DevTools

Flutter security uses platform secure storage.

  • flutter_secure_storage

    Uses iOS Keychain and Android Keystore for secure key-value storage. Tokens and sensitive data must be stored here, never in SharedPreferences or Hive without encryption.

  • Certificate pinning

    Dio supports custom BadCertificateCallback and custom HttpClient for certificate pinning. Required for financial and health apps.

  • Biometric auth

    local_auth package wraps iOS Face ID/Touch ID and Android BiometricPrompt. Combine with flutter_secure_storage for biometric-protected token access.

  • Root/jailbreak detection

    flutter_jailbreak_detection checks for root/jailbreak. Required for financial apps. Note: OEM Android devices with custom ROMs can trigger false positives.

  • Code obfuscation

    Flutter release builds with --obfuscate flag obfuscate Dart symbols. Combine with --split-debug-info for crash symbolication.

  • Platform channel security

    Platform channels are an IPC mechanism — validate all data received from platform channels as untrusted input. Do not expose sensitive native operations via MethodChannel without authentication.

From concept to both stores.

  1. 01. Architecture

    Feature structure, Riverpod setup, navigation, data layer design and platform channel requirements.

  2. 02. Design System

    Flutter widget library, platform-adaptive components, typography, colours and animation standards.

  3. 03. Core Development

    Feature development targeting iOS + Android simultaneously. Regular testing on physical devices.

  4. 04. Platform Integration

    Push notifications, biometrics, camera, location — platform channel development where needed.

  5. 05. Performance

    Flutter DevTools profiling, jank elimination, startup time reduction and image memory optimisation.

  6. 06. Testing

    Unit tests with mocktail, widget tests, integration tests on Firebase Test Lab.

  7. 07. Store Submission

    App Store and Play Store submission via Codemagic, Shorebird setup for post-launch hotfixes.

Frequently Asked Questions

Flutter vs React Native?

Flutter compiles to native ARM, renders via its own engine — no JS bridge, consistent performance. React Native uses native components — feels more native per-platform but with JS bridge overhead. Flutter is better for: consistent cross-platform UI, complex animations, teams comfortable with Dart. React Native better for: teams with React/JavaScript expertise, apps needing a very native per-platform feel.

How much code is shared?

Business logic, API clients, data models, state management: ~95% shared. UI: 85-90% shared with platform-adaptive components for platform-specific patterns. Platform channels: 0% shared (written in Swift/Kotlin). Total: typically 80-90% code sharing vs building two separate native apps.

Can Flutter target web too?

Yes, but with caveats. Flutter Web uses CanvasKit which downloads ~4MB of WASM — poor for first load on slow connections. Not SEO-friendly. Best for: dashboard/admin panels as extensions of mobile apps, not for public-facing web content. Use Next.js/React for public web, Flutter for the app extension.

What is Shorebird?

Shorebird provides over-the-air code push for Flutter apps — push Dart code updates to production without App Store or Play Store review. Bug fixes reach users in minutes. $20/month for 5,000 active devices. Cannot update native code (Swift/Kotlin) or assets (images, fonts). Apple and Google permit code push within their guidelines.