U.S. Devs are Sleeping on Flutter
Do you know what Flutter is? If the developers in Denver i've spoken with are any indication, probably not. Out here, talking to developers about Flutter is sort of like talking to my mother about React... which is to say they have no idea what i'm talking about.
So what is Flutter and why does it matter that devs in the US aren't paying attention to it?
Flutter is a cross-platform mobile development framework created by Google. It is open source and was originally released in 2017. You build Flutter apps primarily in Dart.
Dart is a compiled and statically typed language that, while syntactically similar to Java, prefers conciseness over verbosity. Good riddance. Dart is also single-threaded. This means JavaScript aficionados will find Dart's async/await and Future syntax familiar, particularly if they have worked in a statically typed language before.
If you are thinking this sounds like React Native + TypeScript but with a different language, you are somewhat correct. In fact i would point to the popularity of React (and thus React Native) in the US as the primary reason more people aren't familiar with Flutter here.
But while Flutter and React Native aim to solve a similar problem, they do so in fundamentally different ways. The strength of React Native is that it is a familiar stepping stone for web devs to dip their toes into the mobile app pool. But that ease of entry is not without cost. Chief among them is the continued requirement of a JavaScript layer in the resulting apps. For trivial apps this layer may not be apparent to the user, but as your app's complexity grows it can be a constant source of frustration for the devs and eventually the customers as performance inevitably suffers from the native to JS bridge React native requires.
I believe Flutter is going to eventually win the mobile development ecosystem. To a developer unfamiliar with Flutter that might sound like ignorant nonsense. To them i say, you are the reason i am writing this post. I'd consider reading on with an open mind.
The current mobile ecosystem
Let's assume you are going to be coding a mobile app starting tomorrow. You will want both Android and iOS apps because market share. What are your stack options? The choices i am familiar with are: fully native, React Native, Flutter and Cordova.
Cordova is right out. The target was considerable: reuse almost all of your existing web code to create cross platform apps! Unfortunately this fanciful promise comes with huge issues: any non-trivial app can expect a mountain of UX issues, from memory overflows to non-native response times and frame-rates. For any serious production app it should be avoided.
Fully native apps in $LANGUAGE
(Obj-C, Swift, Java, Kotlin, etc) are the opposite side of the spectrum. What you gain in control and tight hardware integrations you sacrifice in development time. It is hard to overstate the amount of complexity you inject by maintaining separate codebases in separate languages tasked with delivering roughly identical experiences across separate platforms. Unless your team is overflowing with developer resources or you require tight integrations with native device libraries like CoreML, i would avoid going fully native.
Which brings us to React Native and Flutter. As you can see i consider both of these options to be superior to the alternatives. Which is not to say they are equivalent. Flutter is a clear winner for me.
Flutter's Advantages
When we compare Flutter to React Native in isolation, the advantages are apparent enough to consider it despite the learning curve of a new language and framework. That said, if you are familiar with either React or Java, parts of Flutter will feel quite intuitive.
Native Performance
The most obvious and least debatable win for Flutter is the performance of the resulting apps. React Native, for all its good, still utilizes a JavaScript layer in its compiled apps. This is not ideal and anyone who has wrestled with trying to avoid bridging that layer will attest to its problems.
Flutter was originally started with the vocalized intent to "render consistently at 120 frames per second". This is equal parts bold and overkill, as even the best phones on the market today hang out around 90Hz. I haven't bothered to test if that 120fps claim has been upheld, but i can say performance is handled so well by Flutter that performance optimization is basically nonexistent assuming you aren't doing something intentionally silly.
Coding Speed
Admittedly, language proficiency is highly subjective. That being said, the Flutter team has developed some excellent UI packages, namely Material and Cupertino that change the game for UI development. Including either of the packages into your app feels like a superpower. I would liken the feeling to when i first ran rails generate scaffold
years ago.
But unlike Rails scaffold, the Material package makes no assumptions about your implementation. Instead it abstracts all of the "hard parts" of mobile UI development and provides you with a seemingly endless collection of layouts and components. The ability to code custom, relatively complex UI's in minutes felt like magic and is the most fun i've had coding in years.
Perhaps the hardest part of picking up Flutter is learning the sheer volume of these components. It feels like every day that i learn of some new component or property that would have saved me hours of custom-coding a common UI solution. This can be frustrating but also has an obvious upside. It makes me wonder how fast Flutter actually allows for the coding of mobile UI's when you have years of experience.
Building Pipeline
To start, i'm not a fan of the Gulp/Grunt/Webpack/Babel/Npm Javascript ecosystems of the last few years. So just about anything offering a saner alternative to that wins immediate points in my book.
Flutter improves on this by making just about every part of the process simpler: installation, configuration, package installation, hot reloading, and final compilation. On my first Flutter project i remember thinking i had missed something when i set up my project because of how fast it was.
Which brings to me to IDE tooling. The Flutter team has spent a ton of time tooling Android Studio to maximize efficiencies building Flutter apps. I, however, refuse to daily drive an editor not named Textmate 2. I am happy to report that Flutter has remained an excellent and simple coding experience despite my nose-in-the-air attitude.
Documentation
The Flutter and Dart documentation is, in a word, impressive. Anyone who has tried to learn a poorly documented system knows the pain that comes with that.
As i've mentioned already, the hardest (slowest?) part of learning Flutter is uncovering the library of UI components and their usages. The Flutter docs are invaluable in this exercise, going as far as having short videos for many popular widgets giving ~90 second walk throughs of their usage.
Most component docs also link to related components. This allows for wikipedia-style rabbit holes of discovery where every page you end up on stands to improve your abilities in the future. These semi-directed expeditions through the documentation have saved me countless hours of coding.
Future
Fans of Flutter will surely note that i described Flutter as a mobile development framework. This sells the platform short. In reality Flutter intends to be used as a desktop development platform as well. The latest versions of Flutter actually include alpha builds of these features.
Furthermore, Google's Fuchsia project is officially intended to be support both Flutter and Dart. In fact, Google quite literally chose Dart over it own language, Go, as a supported language within Fuchsia.
So what?
So if Flutter is as good as i say, why hasn't Flutter caught on in the US yet? Your guess is as good as mine. I'd say the primary reason is not enough people have tried it yet. I'd point to the prevalence of React in US companies and our coding bootcamps as the driver there. React is frankly a gateway drug to React Native for web devs. The growing popularity of Swift in recent years almost certainly has an effect as well. Also, remember that Flutter only 3 years old.
That needs to be restated. Flutter hasn't existed for 3 full years and it has been in active development that whole time. This is new enough that we haven't had time to find out what peak-productivity in Flutter is yet. The eventual masters of the platform have yet to be crowned. Knowing how productive my time with Flutter has been makes this profoundly exciting. In the US, the foundation might have been laid but we are still very much on the ground floor of the Flutter ecosystem. Developers who take the time to learn it now will be ahead of the market and should expect the windfalls that come with that experience.
How to get started
If you want to get started using Flutter i would suggest checking out the official install page for their setup instructions. There are also some handy Udemy and Youtube tutorials on the topic as well.
Or, if you are like me and you have experience in React or Flex i think you might learn fastest by jumping right into a codebase and seeing how the platform words relative to those existing techs. Pick with the method that best fits your learning style and go wild.
Some closing thoughts
Flutter surprised me. I'm used to being unimpressed by new languages and frameworks. I find most to be wheel reinventions created by people who were unfamiliar or unhappy with existing solutions to the same problems. I try not to be a tech curmudgeon, but some of the recent "advancement" in web techs feel more like regressions to me.
Flutter is an exception to this pattern. It attacks a clear problem: native mobile development for multiple platforms is a shitshow. Coding each natively is a monumental waste of development resources. Using React Native, or far worse, Cordova, returns your time at the expense of customer experience.
Coding is at its best when you catch yourself dancing at your desk because something you coded leaves you feeling like a magician. Flutter has been that for me more often than not this last year. I hope some of you find it fits as your dancing shoes, too.
tl;dr: Flutter is the future of cross platform mobile development. Developers in the US are going to be late to the party at the current pace.