Flutter: The Good, the Bad, and the Ugly
I built a simple app using Flutter. You can download Kabbalah Numerology from the Google Play store or try the web app. The best part of Flutter is that I wrote one codebase and the app runs on Android, iOS, and as a web app.
I love Material Design. I’ve used Material with Angular so it’s not new to me.
Android Studio is awesome. It’s based on IntelliJ, JetBrains’s Java IDE. I’m coming from Atom so this was a big leap forward for me.
Hot restart in Android Studio is great. Coming from Angular I’m used to refreshing the browser and immediately seeing the changes. Apparently developing for mobile isn’t the same. There’s something called Gradle that you need for Java that takes forever to build your app. I don’t know, I’ve never used Java. To update your app on a mobile device takes a few minutes but in the emulators the updates are nearly instant.
My 2014 MacBook Pro is fast enough for coding in Android Studio. Building for mobile devices and running the builds to deploy to Google Play and Apple’s App Store are slow but you don’t need to do this often.
The Flutter community is wonderful. When I got stuck I usually found the answer on Stack Overflow. When I had to ask a question I received answers with 24 hours, always clear. The Flutter docs and videos, especially the “Widget of the Week” show, are excellent. I tried a few tutorials then gave up and just built an app.
I noticed that the Flutter community is highly international. In fact, Americans seem to be scarce on the ground. It seems like Flutter is mostly used by South Asians and eastern Europeans. Which is good if you can hire internationally for your Flutter team. (A recruiter told me that American Flutter senior developers now earn 160K–180K and mid-level developers earn 140K–160K.)
Flutter isn’t model-view-controller (MVC). Coming from Angular this was a shock. Flutter isn’t a framework. It’s a UI design library. You can design beautiful apps in Flutter. But your code has logic mixed in with view elements. Flutter has controllers—and you’ll use a half-dozen for a single view.
On the positive side, modularizing my code was easy. When I got a class working I moved it into it’s own file and called it as a dependency. But what was inside a class could be messy.
Flutter is verbose. There’s a lot of code as widgets get nested like Russian dolls. Sorting out all the closing parentheses, square brackets, commas, and semi-colons is a constant headache (Android Studio handles most of this).
My Android and iOS apps look great. My Flutter web app on the other hand…let’s just say that Flutter isn’t intended for web apps. My web app works fine but it’s not going to win any design awards.
Two things stopped me cold.
I wanted to make a Donate button for users to send me a dollar or two if they liked my free app. I spent a huge amount of time setting up Apple Pay and Google Pay and then installing and setting up the flutter_stripe package. I never got Stripe working. The documentation for flutter_stripe was spare, to say the least. I posted a support ticket with some suggestions for improving the documentation, which the developers accepted and thanked me for. They told me that they’re working on better documentation.
Apple Pay requires Xcode to set up. I don’t use Xcode so doing anything in this IDE is daunting.
Deploying my app to Android (getting my app into the Google Play store) required jumping through a lot of hoops but none of the hoops were hard to get through. Deploying to iOS (getting my app into the App Store) was nightmarish. Again this required doing stuff in Xcode. I had my app running perfectly in the iOS emulator and on my iPhone but I couldn’t get flutter build ipa, which is the command to build your iOS app for production, to run without errors. The problems included dependencies that were dependent on other dependencies, with some monkey wrench left in the works. CocoaPods, Apple’s dependency manager, kept throwing inscrutable errors. After a frustrating day I gave up.
What Flutter Is For, and Not For
Flutter is for mobile apps with fast, awesome UI, graphics, and animations.
It’s not for games. It’s fast but there are better libraries specifically for games.
It’s not for audio processing. Flutter doesn’t access the iOS and Android audio libraries. These may be added in the future.
If you’re building a complex web app use Angular. If your business depends on customers doing complex stuff on a web app, with Flutter you’ll risk losing customers. For example, I host Airbnb. Sometimes my guests call me asking me to do something such as change their reservation dates, that they can’t easily do on their mobile device, but is easy on Airbnb’s web app. Airbnb’s web app is hard enough to use (highly complex with a lot of data) and everything has to be perfect. You don’t want guests showing up at 2am on the wrong night. I would use Flutter for Airbnb’s mobile apps but I would use Angular for its web app.