Our default recommendation for cross-platform mobile work has been React Native for a couple of years, largely because it shares a language and mental model with our web React work, which makes it easier to move an engineer between a web project and a mobile one when a client's staffing needs shift. We rebuilt a small internal app, an inventory-tracking tool used by our own operations team, in Flutter to make sure that default still holds up against a real alternative rather than assuming it does.
Flutter's widget-based layout system produced more visually consistent results across iOS and Android with less platform-specific tweaking than we needed in React Native. Where the React Native version needed a handful of `Platform.OS` checks to adjust padding and shadow rendering between the two platforms, largely because it still delegates to native UI components under the hood, Flutter renders its own widgets consistently through its own graphics engine, so the same layout code produced near-identical results on both platforms without platform-specific branches.
React Native's advantage is entirely about our team rather than the framework itself: existing React knowledge transferred almost directly, and an engineer who'd never touched React Native before was productive within a day, since components, props, and state all work the way they already expect from web React. Flutter meant ramping up on Dart from scratch, a language none of our team had prior experience with, and while Dart itself isn't difficult to pick up, particularly for anyone coming from a typed language background, it was still a genuine cost that React Native simply didn't impose.
Hot reload was fast and reliable on both platforms, though we noticed Flutter's felt marginally more consistent, with fewer of the occasional full-reload-required situations we still hit occasionally in React Native when certain kinds of state changes don't survive a fast refresh. Plugin ecosystem breadth still favors React Native, simply by virtue of being older; for a couple of niche native integrations we needed, a maintained React Native plugin already existed where the Flutter equivalent was community-maintained and less actively updated.
Flutter is genuinely impressive, and we'd recommend it without hesitation to a team without existing React investment, particularly given how consistent its rendering is across platforms. For us, the shared codebase with our web work and the hiring pool that comes with a much more common language keep React Native as the default for now, though this comparison has made us more willing to recommend Flutter to clients whose teams don't already have a foot in the React ecosystem.