Flutter 2 brought stable support for web and desktop platforms. After three production projects — a fintech app, an internal company portal, and a B2C e-commerce app — we have a clear opinion on where Flutter excels and where it still hits its limits.
Why Flutter and Not React Native¶
At the start of 2021, we faced a decision: React Native or Flutter for a new mobile project. React Native has a larger ecosystem, and JavaScript developers are easier to find. But Flutter convinced us with three things:
- Performance: Flutter compiles to native ARM code via AOT (Ahead-of-Time) compilation. No JavaScript bridge. Animations run at 60 FPS even on low-end devices.
- UI consistency: Flutter renders its own pixels via the Skia engine — the UI looks identical on iOS and Android. No surprises when testing on the other platform.
- Hot reload: Sub-second hot reload dramatically speeds up iteration. Change a widget, see the result instantly. Compared to native development, it’s a game changer.
Dart — A Language That Surprises¶
The biggest concern before adopting Flutter was Dart. Nobody on the team knew it. Reality? A developer with a strong Java/Kotlin or TypeScript background becomes productive in 2–3 days. Dart is a clean, typed language with modern features — null safety (since Dart 2.12), async/await, extension methods.
Sound null safety, introduced in March 2021, is a huge step forward. Null reference exceptions are a thing of the past in Dart — the compiler forces you to handle nullable types. After years of NullPointerException in Java, it’s liberating.
Architecture — State Management¶
Flutter offers dozens of approaches to state management. After experimenting, we settled on the BLoC (Business Logic Component) pattern with the flutter_bloc library. Why:
- Testability: BLoC is pure Dart — unit tests without Flutter dependencies
- Separation of UI and logic: Widgets only display state, BLoC handles business logic
- Scalability: The pattern works for both small and large applications
- Debugging: Bloc Observer logs every state change — great for debugging
For smaller projects (prototypes, internal tools), we use Provider or Riverpod — less boilerplate, faster start.
Performance in Practice¶
A fintech app with complex charts, real-time data, and animations. Performance metrics on a Pixel 4a (mid-range device):
- Cold start: 1.2s (comparable to a native Kotlin app)
- Frame rate: stable 60 FPS even when scrolling complex lists
- APK size: 12 MB (release build with tree shaking)
- RAM: ~80 MB idle, ~120 MB during active use
The only performance issue we encountered was with the web version — Flutter web in 2021 is still slower than a native web application. Fine for internal tools, but we wouldn’t recommend it for public-facing web.
Ecosystem and Packages¶
pub.dev has over 20,000 packages. Quality varies, but key libraries are solid:
- dio for HTTP — interceptors, retry, cancel tokens
- freezed for immutable data classes — generates ==, hashCode, copyWith
- hive for local storage — a fast key-value store
- firebase_* for backend — auth, Firestore, push notifications
Problems arise with platform-specific plugins. If you need Bluetooth, NFC, or advanced camera functionality, plugins exist but quality and maintenance vary. Sometimes you have to write platform channels yourself.
When Not to Use Flutter¶
Flutter is not a universal solution. We don’t recommend it for:
- Heavily platform-specific apps: ARKit/ARCore integration, iOS Widgets, Watch apps
- Public-facing web: Flutter web lacks SEO, accessibility is limited, bundle size is large
- Existing native codebase: Migrating from Kotlin/Swift to Flutter rarely makes sense
- One-off prototypes: If you’re targeting only one platform, native development is more efficient
Flutter in 2021 — Production-Ready¶
Flutter 2 is a production-ready framework for mobile development. If you need a single codebase for iOS and Android with native performance, it’s the best choice on the market. Web and desktop support are a bonus, but not yet at the level of the mobile part. The biggest benefit? One team, one language, two platforms — and 30–40% cost savings compared to two native teams.
Need help with implementation?
Our experts can help with design, implementation, and operations. From architecture to production.
Contact us