Have you heard the phrase, "Write Once, Run Anywhere"? It was coined by Sun Microsystems to illustrate the cross-platform benefits of Java. Java is still used extensively but ultimately failed to deliver on WORA due to platform-specific discrepancies, performance variations, and inconsistent GUI appearances across devices.
Anyway, I mention it because programmers haven't given up on the WORA dream which is why new cross platform frameworks surface on a regular basis. Xamarin, ReactNative, Flutter and Electron are some of the most prominent ones today. While I think they've done a better job achieving the WORA dream than Java, there's still a price to pay.
Flutter is the one that I chose to build my app, Family Ledgers. In fact I did my first ever YouTube series about it where I share my experiences while developing the app start to finish. The app has been live on the App Store and Google Play for about 3 months now.
Coming from a primarily native iOS and Mac (Swift) background, a few things stood out, both positive and negative.
On the positive side is the diverse widgets community. There's very little custom code in Family Ledgers because I was able to find an existing widget for pretty much everything I needed to do. The Apple ecosystem has no such thing, so that was refreshing and reminded me how open source can foster thriving communities.
Also, I was pleased to see how easy it was to customize the UI of a Flutter app. I'm accustomed to Apple's passive aggressive tendency to make their native UI elements, like navigation bars and tab bars very difficult to customize. When I create SwiftUI apps, for example, I end up creating a lot of custom UI elements because the ones provided by Apple are either impossible to customize, bug-ridden or both. With Flutter, I would be less likely to resort to such measures. Although it can be fun to build custom UI elements, I'd rather avoid it because there are a lot of details that are easy to miss especially when it comes to accessibility.
Lastly, working in VSCode (the IDE typically used for Flutter projects) was nice. You can tell that it is an IDE for developers by developers and another example of how open source can give rise to extraordinary tools. Hot reload is a godsend and makes development so much more efficient. Swift Previews, the closest thing Apple has to hot reload, is a bit of a joke.
Now to the negative aspects.
Dart sucks. It may sound trite, but coming from Swift/SwiftUI, it's the only conclusion you can draw. It is obscenely verbose. If it wasn't for VSCode's auto formatting and code generation, it would be unbearable to work with. It's definitely Java's predecessor in that regard. I also found it difficult to work with when it came to building a UI where a lot of things are changing at once, and those changes need to be reflected in multiple parts of the app simultaneously without getting out of sync. This kind of stuff is trivial in SwiftUI.
Overall it feels like the platform is a generation or two behind when it comes to framework design. While Flutter can probably do everything that SwiftUI can do, it does it in a ham-handed way with orders of magnitude more code.
Other negatives include app size (download size) and build times. Flutter apps are heavy since they need to carry the runtime around with them. There is a lot going on under the hood. Native apps however, like those written with Swift, are fast and light. If it wasn't for hot reload, you'd spend an unbearable amount of time waiting for your project to compile. And it only gets worse with every dependency you add. And Flutter apps tend to accumulate a lot of dependencies. Apple's ridiculous previews can be tolerated because build times are short.
Another big negative for me is having to deal with Google. Family Ledgers is my first Android app, and therefore my first experience publishing on Google Play. I didn't like it. There is a lot of headache-inducing hoop jumping when it comes to interfacing with the Google ecosystem. Everything feels unnecessarily complex--lots of friction. Family Ledgers is my first app where I used Revenue Cat because Google Play's receipt processing was practically incomprehensible.
So, in conclusion, was it worth it?
The answer to that question is highly dependent on how the app is doing. And I can tell you it's not doing that great, especially on Android. The installations on Android have been pathetically low. In fact, the lowest I've ever seen. The installations on iOS have been pretty pathetic as well but much better then Android. I've had a handful of conversions to paid on iOS but zero on Android.
So with that in mind, no, it wasn't worth it. It wasn't worth it from a financial perspective and it wasn't worth it in terms of the overhead it has added to my app portfolio. If I could do it again, I would have simply written the app in SwiftUI.
It was nice to experience another development platform and to be reminded how open source communities can really liven things up. The Apple ecosystem could use an infusion of open source as many parts of the platform are stagnant. With more eyes on it, it could be a lot better. However the main takeaway for me is the importance of simplicity.
One of the main reasons I went indie was to take control of my time on this earth. And part of that is keeping overhead low; keeping things as minimal as possible. If that means hypothetically "leaving money on the table" by not having my apps on Google Play then so be it.