Building apps with Flutter: the Good and the Bad

Building apps with Flutter: the Good and the Bad
Photo by Artur Shamsutdinov / Unsplash

I began tinkering with Flutter shortly after its initial release. Part of my explorations were due to evaluating it for my job, but I also thought the technological approach was interesting and that's what kept me going back to Flutter as it continued to mature. The promise (at that time on the roadmap) for support for desktop platforms excited me.

As Flutter matured, I kept returning to it, building simple, multi-platform apps to support my tabletop gaming hobby (goofy things like a dice roll tracker, a ranged attack calculator for GURPS, and a sort of compendium for HEXplore It).

When we decided to start AL7, we decided to focus our tech stack on Flutter, so now I've been spending more consistent time in it and learning a lot. After working with Flutter for the last several months, I thought I'd share some thoughts on what it is like to build applications with Flutter.

The Good

I'm going to start with the things that make me enjoy building applications in Flutter, and a huge part of that for me is the programming language, Dart. Even though it has actually been around for more than a decade at this point, I don't think Dart really became familiar to people until Flutter entered the picture. I really like Dart; it has its issues, but overall I like the syntax, language features and performance. It is also being actively improved. Just a few language features I like: Records (sort of like tuples from Python or TypeScript), Patterns and the syntactic sugar around class constructors.

Developing multi-platform apps in Flutter is also a big win — it is pretty easy to run and debug the app on desktop, a connected phone, or in a simulator. Usually, I'm developing with the app running on either my Android phone or on my Macbook, and the hot reload/restart makes iterating on code changes very quick.

Overall, I think the performance of Flutter apps is great; it feels good, both on my phone and on my laptop. However, this doesn't mean you won't have to deal with performance optimizations (see more below).

The Bad

And now for a few not-so-great things about building applications with Flutter. One thing that can be very frustrating is finding resources about building things in Flutter, especially complex things. Flutter has exploded in popularity, but the bulk of content I see is regurgitation of the same "Counter" tutorial. I am hopeful that over time, in-depth articles about solving actual real-world scenarios will become the normal; maybe I'll even write a few.

Sort of along those same lines, there are a lot of different ways to handle state management in Flutter, but once again it seems hard to find information around architecting complex app state. Many of the same architectural paradigms that exist in JavaScript have libraries for Flutter, so I am sometimes able to find an analogous tutorial for a web framework like React that I can somewhat apply to Flutter, but there are some major differences with how Flutter apps work so it requires a trial-and-error approach.

Another thing I haven't been too impressed with is package management, especially when it comes to updating packages with pub outdated/update. I can't quite put my finger on it, other than it behaves poorly at times.

And, finally, performance; I haven't hit a lot of performance issues yet, but I did hit one issue and I found debugging the render process to be confusing and hard to pinpoint where the actual problem was occuring. I figured some stuff out, I think I learned a few things, but also I found that deleting my build output entirely and re-running the app cleared a bunch of things up. I have no idea why.

The Future

So that's it; some extremely basic thoughts around my experiences with Flutter so far. I am definitely enjoying myself, and think Flutter is a great option for making multi-platform apps. I can only hope that the ecosystem around development continues to improve.