Cross-platform frameworks differ mainly in who draws the pixels. React Native 36,878 asks the platform to draw its own widgets. Flutter 16,720 draws every pixel itself with its Impeller engine, so a Flutter button looks identical on Android and iOS unless you choose a platform-styled widget set. Capacitor 243,123 and Cordova 129 (Cordova and Capacitor) show a web page in a WebView. Fully native apps (Android with Kotlin) use Kotlin with Jetpack Compose 234 on Android and Swift with SwiftUI on iOS, and are written twice. Kotlin Multiplatform 25,990 sits in between: it shares Kotlin business logic, and Compose Multiplatform 25,990 , stable on iOS since version 1.8.0 in May 2025, can share the UI as well.
| Question | React Native | Flutter | Native (Kotlin, Swift) |
|---|---|---|---|
| Language | JavaScript, TypeScript | Dart | Kotlin and Swift |
| Who draws the UI | Platform widgets | Flutter's own engine | Platform widgets |
| Code shared | Most UI and logic | Most UI and logic | None by default |
| New OS features | Via modules, days to weeks | Via plugins | Immediately |
| Over-the-air updates | Yes (EAS Update 6,418 ) | Not built in | No |
Choose React Native when your team knows React 7,897 and wants one codebase that feels native, with JavaScript fixes shipped without a store review (EAS Update); Flutter when identical branding on every platform matters most; native for apps built on one platform's newest APIs or heavy graphics.