Flutter, developed by Google, is a (relatively) recent entrant to the mobile app development scene, where it competes with the likes of React Native to deliver a framework for frontend UI development and smooth backend integration.
Since I haven’t personally used React Native all that much, I will primarily focus on the elements of Flutter that I enjoyed, rather than stage a boxing match between the two. A bit of a backstory first: I originally envisioned myself as a “fundamentals” programmer, and I didn’t really see myself enjoying app development, since it seemed to be primarily design rather than algorithms, and this ambivalence was stoked by Android Studio’s sprawling clunkiness. However, I can honestly say that Flutter has converted me - I now enjoy front-end development, and am exploring back-end technologies and proto service architecture too!
The primary point of appeal, especially for someone who is aiming to go the whole hog and widely publish their app, is that Flutter is natively cross-platform - write once, run anywhere in its modern incarnation. Saves you from having to splurge on a Mac to get Xcode, and then rewrite your Android code for iOS. Oh and - this doesn’t mean the end result will be exactly the same for the two, which might lead to unnatural formatting and components. Upon writing the code once, the UI elements take the form of the native components on their respective system! As of late, it’s no longer limited to mobile devices, Flutter has burst onto the web app and IoT scene too!
Flutter also integrates seamlessly with Firebase (Google’s service platform for mobile and web applications), so there are solid backend options already in place. The community-developed SQLite package is also very sturdy and apt for local storage: together, they form a very effective duo.
The UI system is a pleasure to work with. Flutter’s motto is “Everything is a Widget”, so immediately after conceiving the layout of your app, you can jump straight into an extremely modular but compact design. It does use its own language, known as Dart, but this is hardly a downside since the language is extremely similar to Java/C#, and nobody who’s been programming for more than a couple of years will have any problem picking it up simultaneously. That said, I feel like they could have employed a slightly more modern, quirky language - Dart is a bit staid and unadventurous, but it gets the job done.
Features from http requests to JSON serialisation are a breeze, and traditional UI elements like animation, navigation and themes are extremely intuitive to use and look fantastic, build times are reasonable, and the “hot reload” feature is very handy. Once you have a handle on the numerous widgets and the core principles of their sizing, one can develop impeccable-looking apps very rapidly - I was pleasantly surprised, since the only UI I had done prior to this was Java’s Swing API (I’m old school, I learned from books written in the late ’90s). The error messages are not the best, but most problems are generic and solvable via the Stack Overflow corpus.
The Flutter community also seems to be very integrated, helpful, and proactive in package development, and the package management system is as efficient as cargo in Rust. However Flutter is still maturing, and a uncomfortably large reliance on external, only moderately stable packages is often inevitable for large apps. But the size of the community support and effort on these repositories is just indicative of how effectively Flutter is bringing in and retaining app developers - despite its fledgling status, it boasts an impressive array of widgets, solid documentation and toolchain integration.
I have personally used Flutter to develop the frontends of a wide array of applications, including a news aggregator and an app to connect students with propsective mentors - I’m loving the experience, and I wholeheartedly recommend that any app developer, whether a beginner or an Android Studio veteran, give Flutter a go.