androidengineers.Book a session

Cross-Platform Considerations

Flutter vs RN vs Native Trade-offs

article25 minMedium

Choosing a mobile technology stack is one of the most consequential architectural decisions. Each approach has concrete strengths and weaknesses that show up in specific scenarios.

Comparison Matrix

DimensionNative (Kotlin/Swift)FlutterReact Native
PerformanceHighestVery highHigh (JSI bridge)
UI fidelityPerfect — platform controlsCustom engine (Skia/Impeller)Mostly platform controls
Code sharingNone (two codebases)~70–80%~70–80%
OTA updatesNoNo (Dart VM only)Yes (CodePush)
EcosystemMost matureGrowing fastLarge (JS ecosystem)
HireHardest (two teams)ModerateEasiest (JS devs)
Bundle sizeSmallest~5–10MB overhead~3–8MB overhead
Camera/BluetoothBestNeeds pluginsNeeds bridges
AnimationsBestExcellentGood (can stutter)

When Native Wins

  • Games, AR, video editing — GPU-intensive features that need metal/Vulkan directly
  • Deep OS integration — Widgets, accessibility services, VPN, NFC payment
  • Maximum performance — Latency-sensitive features like real-time audio
  • Large existing teams — Splitting into Flutter/RN has a transition cost
  • Platform UX parity matters deeply — Material 3 evolves faster than Flutter wraps it
// Native: Custom CameraX pipeline that Flutter can't easily match
val cameraProvider = ProcessCameraProvider.getInstance(this).await()
val imageAnalysis = ImageAnalysis.Builder()
    .setTargetResolution(Size(1280, 720))
    .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
    .build()
imageAnalysis.setAnalyzer(cameraExecutor, ::processFrame)
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)

When Flutter Wins

  • New product with limited mobile budget — one team ships both platforms
  • Custom design system — Flutter renders its own pixels; your design doesn't depend on platform conventions
  • Games with custom UI — Flutter's rendering model suits highly interactive, animated UIs
  • Internal tools — consistency matters more than platform-native feel
// Flutter: Pixel-perfect custom UI that looks identical on iOS and Android
class ArticleCard extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        gradient: LinearGradient(colors: [Colors.blue, Colors.purple]),
        borderRadius: BorderRadius.circular(16),
      ),
      child: /* custom layout */,
    );
  }
}

When React Native Wins

  • Existing JavaScript/TypeScript team — no new language to learn
  • OTA updates are important — CodePush deploys JS bundle updates without App Store review
  • Web-to-mobile port — much code and patterns carry over from React web
  • Rapid prototyping — fast hot reload; huge npm ecosystem
// RN: OTA update for a business logic fix, deployed in hours not days
import CodePush from 'react-native-code-push';
const App = CodePush({ checkFrequency: CodePush.CheckFrequency.ON_APP_RESUME })(AppComponent);

KMM as a Middle Path

KMM is not a cross-platform UI framework — it shares business logic while keeping UI native. This gives you:

  • Native UI fidelity on both platforms
  • Shared repository, use case, and model code
  • No "lowest common denominator" UI restrictions

Use KMM when you have separate Android/iOS teams but want to eliminate duplicate logic layers.

Key Takeaways

ScenarioChoose
Deep platform features (AR, BLE, payments)Native
One team, custom design systemFlutter
Existing JS team, fast iterationReact Native
Shared logic, native UIKMM
Startup with limited budgetFlutter or RN
Consumer app where feel mattersNative

YOUR LEARNING JOURNEY

0 of 177 available lessons completed

Progress saved in this browser. No account needed.
Flutter vs RN vs Native Trade-offs | Android System Design | Android Engineers