My journey into software development began in childhood, writing games in AMOS Basic on the Amiga. That early fascination with code evolved through university, where I dove deep into 3D game engines. For my final-year project, I built a custom engine and used it to develop a third-person fighting game demo.
I joined QinetiQ as a placement student and, after graduating, transitioned to a full-time role. I worked on C++ signal processing and Java UIs for submarine sonar systems - deep tech, quite literally.
After five years, I moved into the games industry, helping build console and PC titles. It was a short-lived chapter, as the studio was acquired and shuttered within a year. (Welcome to the games industry.)
Then came the iPhone - and with it, a shift to mobile app development. I learned Objective-C and Swift, and eventually started my own agency. But running separate iOS and Android teams proved frustrating. Synchronising development across platforms took enormous effort. I kept an eye on cross-platform tools, but none truly delivered - until Flutter arrived at my door in late 2018.
Why am I telling you this? Well, it's important context to see where I’m coming from.
I’ve been a professional developer for over 20 years now, using C/C++, Java, Objective-C, Swift, Javascript and now Dart. I like trying new things. I’ve also dabbled in Rust, Python and Kotlin. I have no barriers when it comes to trying new languages and moving out of my comfort zone.
My everyday driver language is the one I feel has the best developer experience out of the lot I’ve tried.
At first, I was sceptical. Flutter sounded promising, but I’d been burned before. I built a series of test projects, from small games to a DSP app that communicated via Bluetooth with a looper pedal. To my surprise, Flutter handled it all. Its architecture felt more like a game engine than a traditional mobile framework. Unlike many of its peers, which leaned heavily on web technologies, Flutter was built differently - from the ground up for performance and flexibility.
It didn’t take long to realise this wasn’t just another cross-platform compromise. Flutter was a step forward.
Flutter's backbone, Dart, also impressed me. Unlike JavaScript, which often ends up serving as glue between systems, Dart felt like a proper language for real work. It compiles ahead-of-time into optimised machine code, offers strong typing and null safety, and works just as well for backend services as for UI.
We’ve written real-time audio signal processing pipelines and complex data streaming tools entirely in Dart. While it’s no replacement for low-level C in some areas, Dart’s native interoperability via FFI means we rarely need to drop into C at all, and when we do, the integration is seamless.
What excites me most about Flutter today is its full-stack potential. We now use Dart not just for mobile and web UIs, but also for backend services running in Docker containers on Google Cloud Run. We manage media processing via FFmpeg, run AI object detection with YOLO, and apply the same architecture patterns, like dependency injection and state management, across both frontend and backend.
This unified stack simplifies our codebase, reduces bugs, and makes onboarding new developers easier. One stack, one mindset, fewer headaches.
React Native is often marketed as a cross-platform solution, but it falls short of delivering a unified experience in real-world development.
Although it allows sharing a codebase between iOS and Android using JavaScript, developers frequently need to write platform-specific logic. This can take the form of conditional code using the Platform module or entirely separate files (e.g., Component.ios.js vs Component.android.js). Even when using shared components, subtle differences in behaviour, styling, and performance across platforms often emerge, requiring ongoing testing and fine-tuning for each OS.
Another core issue is the way UIs are defined. React Native uses JSX, a JavaScript syntax extension that mixes HTML-like markup into JavaScript. This is effectively a syntax mode switch, introducing an embedded DSL (Domain-Specific Language) for rendering logic. While flexible, JSX creates a disjointed mental model: you're writing markup inside logic, which can become hard to follow as complexity grows.
Flutter, by contrast, uses a single, unified language (Dart) with a purely declarative widget system. UI components are just objects - built, composed, and rendered consistently. There's no syntax switch. It’s all code, which makes it easier to refactor, test, and reason about, especially in large codebases.
React Native also relies on the JavaScript bridge to communicate with native APIs. This asynchronous bridge introduces latency, especially in animation-heavy or real-time contexts. Flutter avoids this entirely by compiling to native code and rendering UI via its own engine, sidestepping the native component tree and reducing performance overhead.
While React Native is a solid choice for simple apps or teams deeply invested in the JavaScript ecosystem, its inconsistencies and performance limitations can become serious bottlenecks in more demanding projects.
Kotlin Multiplatform (KMP) takes a different approach, focusing on sharing business logic across platforms while leaving UI implementation to native toolkits (e.g., SwiftUI on iOS, Jetpack Compose on Android).
This allows for high performance and fully native UIs, but it also means you're maintaining two separate UI codebases, with all the associated complexity. You get some reuse, but at the cost of duplicated effort in layout, styling, and interaction layers.
KMP is still maturing, with limited tooling compared to Flutter and less community adoption. For teams that want full control over platform-specific UIs and are already Kotlin-heavy, it can work, but it lacks the holistic, all-in-one experience Flutter provides.
Flutter isn’t just a development framework - it’s a strategic asset. It lets us deliver high-quality, cross-platform apps quickly and maintainably. We’ve cut development time, improved consistency across devices, and reduced the mental load of managing multiple tech stacks.
By embracing Flutter, we’ve unlocked a development approach that is fast, elegant, and powerful - from pixel to packet.
And we aren’t the only ones who see its advantages, check out#FlutterInProduction.
Did you know? As of early 2025, Flutter powers nearly 30% of all new free iOS app submissions, according to app intelligence firm Apptopia. This marks a significant rise from around 10% in 2021, highlighting Flutter's rapid adoption among developers seeking efficient cross-platform solutions.
Want more detail? checkout this fantatic post by thedroidsonroids.com